构造不同长度的向量

Constructing vectors of different lengths

我想找出 3 维 space 中零的 rowcolumn 个数。问题是我每次都得到不同长度的输出向量(例如行),因此发生维度错误。 我的尝试:

a (:,:,1)= [1 2 0; 2 0 1; 0 0 2]
a (:,:,2) = [0 2 8; 2 1 0; 0 0 0]

for i = 1 : 2
[row(:,i) colum(:,i)] = find(a(:,:,i)==0);
end

假设您的矩阵的格式为 N-by-M-by-P​​。 在你的情况下

N = 3;
M = 3;
P = 2;

这意味着您搜索的行和列的最大长度(如果所有条目均为零)为 N*M=9

所以一种可能的解决方案是

%alloc output
row=zeros(size(a,1)*size(a,2),size(a,3));
colum=row;
%loop over third dimension
n=size(a,3);
for i = 1 : n 
    [row_t colum_t] = find(a(:,:,i)==0); 
    %copy your current result depending on it's length
    row(1:length(row_t),i)=row_t;
    colum(1:length(colum_t),i)=colum_t;
end

但是,当您将结果传递给下一个函数/脚本时,您必须记住对非零元素进行操作。

我会选择 Zep 的矢量化解决方案。至于更大的矩阵 a 它的内存效率更高,我相信它一定更快。

您可以使用线性索引:

a (:,:,1) = [1 2 0; 2 0 1; 0 0 2];
a (:,:,2) = [0 2 8; 2 1 0; 0 0 0];

% Answer in linear indexing
idx = find(a == 0);

% Transforms linear indexing in rows-columns-3rd dimension
[rows , cols , third] = ind2sub(size(a) ,idx)

有关该主题的更多信息,请参阅 Matlab's help