作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要根据以下要求在 MATLAB 中创建矩阵。给定一个向量 v
,例如 [1,2,2,1,3,5,1]
,我需要形成一个矩阵:
[1 0 0 1 0 0 1;
0 1 1 0 0 0 0;
0 0 0 0 1 0 0;
0 0 0 0 0 0 0;
0 0 0 0 0 1 0]
即矩阵的 i
列在 v[i]
行仅包含一个非零元素(单个 1
)。我怎样才能避免循环并以有效的方式执行此操作?
最佳答案
其他人指出循环在这里很好。我会指出稀疏要好得多。你的矩阵是稀疏的,非常稀疏,所以使用稀疏的能力来解决这个问题,并在矩阵很大的情况下节省大量的存储空间。
N = 3000;
v = ceil(rand(1,3000)*3000);
tic
A = zeros(N,N);
for i = 1:N
A(v(i),i) = 1;
end
toc
Elapsed time is 0.069082 seconds.
tic
B = sparse(v,1:N,1,N,N);
toc
Elapsed time is 0.001308 seconds.
所以如果矩阵很大,时间上会有很大的差异。
空间如何?
whos A B
Name Size Bytes Class Attributes
A 3000x3000 72000000 double
B 3000x3000 72008 double sparse
矩阵在其他方面是相同的。
sum(sum(abs(A - B)))
ans =
0
稀疏矩阵占用的空间非常小,您可以像使用任何其他矩阵一样使用它。
使用 MATLAB 的功能。
关于matlab - 给定非零元素的位置,如何在 MATLAB 中创建稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12658682/
我是一名优秀的程序员,十分优秀!