中没有重复项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),:)=[]
但是如何做匹配部分?
中没有重复项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),:)=[]
但是如何做匹配部分?
这是一个矢量化的解决方案:
[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
这是第二种解决方案(假设我已经正确解释了这个问题):
%// 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
. 考虑到这一点的调整应该不会太困难,尽管您必须提供更多关于您希望如何处理其余行的信息。