Matlab列到行,同时匹配原始行

Matlab列到行,同时匹配原始行,matlab,Matlab,A:,2:结束中没有重复项 我想把A:,2:end的元素放到B:,2和相应的A:,1中,忽略NaN A = [2 3 5; 1 9 NaN] B = [2 3; 2 5; 1 9] B:,2可以通过uniqueA:,2:end和放置双成员B:,2,NaN,:=[] 但如何进行匹配部分?这里有一个矢量化解决方案: [Y, X] = find(true(size(A, 1), size(A, 2) - 1)); B = [A(X(:), 1), reshape(A

A:,2:结束中没有重复项

我想把A:,2:end的元素放到B:,2和相应的A:,1中,忽略NaN

A = [2 3 5;
     1 9 NaN]


B = [2 3;
     2 5;
     1 9]
B:,2可以通过uniqueA:,2:end和放置双成员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

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

[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。考虑到这一点的调整应该不会太困难,尽管您必须提供更多关于如何处理行的其余部分的信息。

假设我正确地解释了问题,下面是第二个解决方案:

%// 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。考虑到这一点的调整应该不会太困难,尽管您必须提供更多关于如何处理行的其余部分的信息。

既然您声明A:,2:end中没有重复项,为什么需要使用unique来创建B:,2?当然你可以用V=A:,2:end,V=V:,然后V=V~isnanV?这应该比调用unique快得多…既然您声明a:,2:end中没有重复项,为什么需要使用unique来创建B:,2?当然你可以用V=A:,2:end,V=V:,然后V=V~isnanV?这应该比调用unique要快得多…@Colin\u T\u Bowers非常有趣。克朗很有用。事实上,当列中有重复项时,我也有一个类似的问题。在这种情况下,我想把它们放在同一行,这样重复:唯一的答案必须依赖于for和if。但是我正在试图找到一个非循环的解决方案。@Colin_T_Bowers为了用你的答案解决这个问题,我创建了另一个问题,如果这个问题解决了,那么我可以用17940788和17964259中的答案来解17916164。你认为这也有可能吗?@user2604484我现在还不清楚如何解决这些没有循环的问题,而且我恐怕还需要一段时间才能有足够的空闲时间。昨天对我来说是一件稀罕的事:-。另外,GuntherStruyf和Dan都是非常优秀的Matlab程序员,所以我猜很难找到比他们所做的更聪明的东西。不过,祝你好运@科林·图·鲍尔斯很有趣。克朗很有用。事实上,当列中有重复项时,我也有一个类似的问题。在这种情况下,我想把它们放在同一行,这样重复:唯一的答案必须依赖于for和if。但是我正在试图找到一个非循环的解决方案。@Colin_T_Bowers为了用你的答案解决这个问题,我创建了另一个问题,如果这个问题解决了,那么我可以用17940788和17964259中的答案来解17916164。你认为这也有可能吗?@user2604484我现在还不清楚如何解决这些没有循环的问题,而且我恐怕还需要一段时间才能有足够的空闲时间。昨天对我来说是一件稀罕的事:-。另外,GuntherStruyf和Dan都是非常优秀的Matlab程序员,所以我猜很难找到比他们所做的更聪明的东西。不过,祝你好运!