A = [a 2 5 8;
b 4 8 NaN]
其中a
和b
是1x3
行向量。
我需要使用:
获取一个单元格数组B
B{1}=2 a
B{2}=5 a
B{3}=8 a b
B{4}=4 b
但排序并不重要。
所以我需要按照1x3
行向量a
和b
按元素放置4,5,6..th列,忽略NaN
我的第一次尝试是unique(A)
,但仅此一项无法消除NaN
,也无法正确匹配。
也许我还需要得到每个元素(2,5,8,4,8)的“行”的索引矩阵,但我找不到。
然后我尝试使用for
和if
。但是我的电脑无法以巨大的文件大小处理它。
答案 0 :(得分:2)
所以你有一个矩阵A
:
A = [a 2 5 8;
b 4 8 NaN];
我首先将矩阵拆分为由a
和b
组成的部分,其余部分:
a_and_b = A(:,1:3);
Arest = A(:,4:end);
然后我们会看到此Arest
矩阵中的唯一项目,并删除NaN
s:
Arest_uniq = unique(Arest);
Arest_uniq = Arest_uniq(~isnan(Arest_uniq));
检查Arest_uniq
行中Arest
中元素的出现次数:
occur_A = arrayfun(@(ii) ismember(Arest_uniq,Arest(ii,:)),1:size(A,1),'uni',false);
因为基于if构造添加行a
和/或b
不是线性操作,所以我宁愿在循环中执行它。
output = num2cell(Arest_uniq);
for ii=1:numel(output)
for jj=1:size(A,1)
if occur_A{jj}(ii)
output{ii} = [output{ii} a_and_b(jj,:)];
end
end
end
使用step-by-step debugging完成此操作,在途中检查变量,最终您将了解所有操作。所以下次你可以当场自己解决问题。