Matlab列在匹配原始行时排

时间:2013-07-30 07:27:05

标签: matlab

A(:,2:end)

中没有重复项

我想将A(:,2:end)的元素放到B(:,2),将相应的A(:,1)放入B(:1),而不考虑NaN。

A = [2 3 5;
     1 9 NaN]


B = [2 3;
     2 5;
     1 9]

B(:,2)可由unique(A(:,2:end))B(ismember(B(:,2),NaN),:)=[]

制作

但如何做匹配部分?

2 个答案:

答案 0 :(得分:2)

这是一个矢量化解决方案:

[Y, X] = find(true(size(A, 1), size(A, 2) - 1));
B = [A(X(:), 1), reshape(A(:, 2:end), [], 1)];
B(any(isnan(B), 2), :) = []; %// Remove NaN values

答案 1 :(得分:2)

这是第二种解决方案(假设我已正确解释了这个问题):

%// Build column 1
BCol1 = kron(A(:, 1), ones(size(A, 2) - 1, 1));

%// Build column 2
BCol2 = A(:, 2:end)';
BCol2 = BCol2(:);

%// Get an index of nans and remove them to obtain solution
I1 = ~isnan(BCol2);
B = [BCol1(I1), BCol2(I1)];

对于大小为100x100的输入矩阵,我使用@EitanT的解决方案循环了1000次,结果是:

Elapsed time is 0.299024 seconds. %// My solution
Elapsed time is 0.434274 seconds. %// @EitanT solution

注意,我在此假设A的第一列不包含任何nan。考虑到这一点的调整应该不会太困难,尽管你必须提供一些关于如何处理行的其余部分的更多信息。