矢量化和去矢量化矩阵的部分

时间:2017-06-30 15:22:14

标签: matlab indexing vectorization

我很难理解此代码中的错误:

我有一堆矩阵,我想取每个矩阵的上三角形部分,将其放入一个向量中,用它做一些事情,并将结果映射回去。这是代码:

%%
n=10;
m=3;

% generate a random 'stack of matrices'
bar=randn(n,n,m);

% index the upper triangular part
inds=triu(true(n,n));

% linearize
bar_lin=permute(bar,[3 1 2]);
bar_lin=bar_lin(:,inds);

% de-linearize
foo=zeros(size(bar,3),n,n);
foo(:,inds)=bar_lin;
foo=permute(foo,[2 3 1]);

% why is this not == 0 ??
sum(foo(:)-bar(:))

我无法理解为什么这不起作用!谢谢!

1 个答案:

答案 0 :(得分:0)

您的最后一行代码不会返回0。这是因为bar变量存储矩阵的上三角部分和下三角部分,而foo仅存储上三角部分。你基本上是在减去这样的东西

bar = [1 2 3;
       4 5 6;
       7 8 9]
foo = [1 2 3;
       0 5 6;
       0 0 9]
foo - bar = [ 0  0  0;
             -4  0  0;
             -7 -8  0]
% Thus it will not be 0 for this case
% even sum(foo(:) - bar(:)) will not be 0

只有当下部(不在foo中的部分)总和为0时,才会将输出设为0(但在随机数的情况下这种情况很少见)