2

中没有重复项A(:,2:end)

我想把 to 和对应的元素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),:)=[]

但是如何做匹配部分?

4

2 回答 2

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
于 2013-07-30T08:00:09.100 回答
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. 考虑到这一点的调整应该不会太困难,尽管您必须提供更多关于您希望如何处理其余行的信息。

于 2013-07-30T08:12:19.523 回答