由Matlab重新排列

时间:2013-07-29 04:39:50

标签: matlab

A = [a 2 5 8;
     b 4 8 NaN] 

其中ab1x3行向量。

我需要使用:

获取一个单元格数组B
B{1}=2 a
B{2}=5 a
B{3}=8 a b
B{4}=4 b

但排序并不重要。

所以我需要按照1x3行向量ab按元素放置4,5,6..th列,忽略NaN

我的第一次尝试是unique(A),但仅此一项无法消除NaN,也无法正确匹配。

也许我还需要得到每个元素(2,5,8,4,8)的“行”的索引矩阵,但我找不到。

然后我尝试使用forif。但是我的电脑无法以巨大的文件大小处理它。

1 个答案:

答案 0 :(得分:2)

所以你有一个矩阵A

A = [a 2 5 8;
     b 4 8 NaN];

我首先将矩阵拆分为由ab组成的部分,其余部分:

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完成此操作,在途中检查变量,最终您将了解所有操作。所以下次你可以当场自己解决问题。