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),:)=[]
但如何做匹配部分?
答案 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
。考虑到这一点的调整应该不会太困难,尽管你必须提供一些关于如何处理行的其余部分的更多信息。