【发布时间】:2025-12-28 21:50:10
【问题描述】:
我正在尝试将A 的第 1st 列与B 的第 1 到第 3rd 列匹配,并附加相应的第 4th sup> B 到 A 的列。
例如,
A=
1 2
3 4
B=
1 2 4 5 4
1 2 3 5 3
1 1 1 1 2
3 4 5 6 5
我比较A(:,1)和B(:, 1:3)
1 和 3 在 A(:,1) 中
1 在B(:, 1:3) 的第 1st、2nd、3rd 行中,因此将 B([1 2 3], 4:end)' 附加到A 的第 1st 行。
3 位于B(:,1:3) 的第 2nd 和 4th 行,因此将 B([2 4], 4:end)' 附加到 A 的第 2nd 行。
这样就变成了:
1 2 5 4 5 3 1 2
3 4 5 3 6 5 0 0
我可以只使用for 和if 来编写代码。
clearvars AA A B mem mem2 mem3
A = [1 2 ; 3 4]
B = [1 2 4 5 4; 1 2 3 5 3; 1 1 1 1 2; 3 4 5 6 5]
for n=1:1:size(A,1)
mem = ismember(B(:,[1:3]), A(n,1));
mem2 = mem(:,1) + mem(:,2) + mem(:,3);
mem3 = find(mem2>0);
AA{n,:} = horzcat( A(n,:), reshape(B(mem3,[4,5])',1,[]) ); %'
end
maxLength = max(cellfun(@(x)numel(x),AA));
out = cell2mat(cellfun(@(x)cat(2,x,zeros(1,maxLength-length(x))),AA,'UniformOutput',false))
我试图通过不使用for 和if 来提高这段代码的效率,但找不到答案。
【问题讨论】:
-
A或B中可以有零吗? -
在
AA(循环内的最后一行)的定义中,您应该使用4:end而不是[4,5]。而且您的代码运行得非常快/高效。如果没有找到更快的解决方案,建议保留它......没有理由避免循环,因为没有循环的更快解决方案。 -
@TheMinion:他的循环体中存在
ismember的问题,这意味着JIT不能有效地加速这个循环。对于更大的问题,这将成为一个问题。 -
@RodyOldenhuis 是的。因此问题不是
for-loop,而是循环内的ismember()。尽管如此,当我运行他的代码和来自 Nishant 的代码时,即使是 10.000x100 条目,他的速度也是最小的。所以不确定ismember()的“问题”是否真的会导致这样的运行时问题。 BTW 不错的解决方案 +1
标签: matlab