gpt4 book ai didi

matlab - 在没有 'for' 循环的情况下使匹配和追加代码更高效

转载 作者:太空宇宙 更新时间:2023-11-03 20:34:49 24 4
gpt4 key购买 nike

我正在尝试将 A 的第 1st 列与 B 的第 1 到第 3rd 列相匹配,并将 B 的相应第 4 列附加到 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)

13A(:,1)

1B( :, 1:3),所以将 B([1 2 3], 4:end)' 附加到 A 的 1st 行。3B(:,1:3) 的第 2nd 和第 4 行,所以追加B([2 4], 4:end)'A 的第 2nd 行。

这样就变成了:

1 2 5 4 5 3 1 2
3 4 5 3 6 5 0 0

我可以只使用 forif 来编写代码。

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))

我试图通过不使用 forif 来提高这段代码的效率,但找不到答案。

最佳答案

试试这个

a = A(:,1);
b = B(:,1:3);
z = size(b);
b = repmat(b,[1,1,numel(a)]);
ab = repmat(permute(a,[2,3,1]),z);
row2 = mat2cell(permute(sum(ab==b,2),[3,1,2]),ones(1,numel(a)));
AA = cellfun(@(x)(reshape(B(x>0,4:end)',1,numel(B(x>0,4:end)))),row2,'UniformOutput',0);
maxLength = max(cellfun(@(x)numel(x),AA));
out = cat(2,A,cell2mat(cellfun(@(x)cat(2,x,zeros(1,maxLength-length(x))),AA,'UniformOutput',false)))

更新 下面的代码几乎与迭代代码同时运行

a = A(:,1);
b = B(:,1:3);
z = size(b);
b = repmat(b,[1,1,numel(a)]);
ab = repmat(permute(a,[2,3,1]),z);
df = permute(sum(ab==b,2),[3,1,2])';
AA = arrayfun(@(x)(B(df(:,x)>0,4:end)),1:size(df,2),'UniformOutput',0);
AA = arrayfun(@(x)(reshape(AA{1,x}',1,numel(AA{1,x}))),1:size(AA,2),'UniformOutput',0);
maxLength = max(arrayfun(@(x)(numel(AA{1,x})),1:size(AA,2)));
out2 = cell2mat(arrayfun(@(x,i)((cat(2,A(i,:),AA{1,x},zeros(1,maxLength-length(AA{1,x}))))),1:numel(AA),1:size(A,1),'UniformOutput',0));

关于matlab - 在没有 'for' 循环的情况下使匹配和追加代码更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25075519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com