我有以下两个矩阵
c=[1 0 1.05
1 3 2.05
1 6 2.52
1 9 0.88
2 0 2.58
2 3 0.53
2 6 3.69
2 9 0.18
3 0 3.22
3 3 1.88
3 6 3.98]
f=[1 6 3.9
1 9 9.1
1 12 9
2 0 0.3
2 3 0.9
2 6 1.2
2 9 2.5
3 0 2.7]
最后的矩阵应该是
n=[1 6 2.52 3.9
1 9 0.88 9.1
2 0 2.58 0.3
2 3 0.53 0.9
2 6 3.69 1.2
2 9 0.18 2.5
3 0 3.22 2.7]
我使用的代码只给出了前一个矩阵[n]的最后一行。
for j=1
for i=1:rs1
for k=1
for l=1:rs2
if f(i,j)==c(l,k) && f(i,j+1)==c(l,k+1)
n=[f(i,j),f(i,j+1),f(i,j+2), c(l,k+2)];
end
end
end
end
end
任何人都可以帮我这个吗? 还有更简单的东西吗?
提前致谢
答案 0 :(得分:1)
答案 1 :(得分:1)
如果您坚持在循环中执行此操作,则需要根据n
给出正确的尺寸
到你正在使用的循环计数器,或者将它连接到每次迭代的自身(这对于大矩阵来说可能非常慢)。例如,写作:
for j=1
for i=1:rs1
for k=1
for l=1:rs2
m=m+1;
if f(i,j)==c(l,k) && f(i,j+1)==c(l,k+1)
n(m,:)=[f(i,j),f(i,j+1),f(i,j+2), c(l,k+2)];
end
end
end
end
end
当循环达到计数器值m
时,会将数字保存到第m行。
但是,请注意,这也可以在没有嵌套循环和if条件的情况下以矢量化方式完成。例如,您可以使用if f(i,j)==c(l,k)...
等来代替条件ismember
答案 2 :(得分:1)
您可以通过一次比较第一列和第二列来减少循环次数,然后使用“all”函数仅在值匹配时折叠值。以下代码段复制了您提供的“n”数组。
n = [];
for r1 = 1:size(c, 1)
for r2 = 1:size(f,1)
if all(c(r1, [1 2]) == f(r2, [1 2]))
n(end+1, 1:4) = [c(r1,:) f(r2,3)];
end
end
end
答案 3 :(得分:1)
您应该学习使用set操作并尽可能避免循环。这里intersect
可能非常有用:
[u, idx_c, idx_f] = intersect(c(:, 1:2) , f(:, 1:2), 'rows');
n = [c(idx_c, :), f(idx_f, end)];
说明:通过指定'rows'
标记,intersect
找到c
和f
中的公共行,其索引在idx_c
和idx_f
中给出分别为{1}}。使用向量下标提取矩阵n
。
让我们使用您问题中的示例:
c = [1 0 1.05;
1 3 2.05
1 6 2.52
1 9 0.88
2 0 2.58
2 3 0.53
2 6 3.69
2 9 0.18
3 0 3.22
3 3 1.88
3 6 3.98];
f = [1 6 3.9
1 9 9.1
1 12 9
2 0 0.3
2 3 0.9
2 6 1.2
2 9 2.5
3 0 2.7];
[u, idx_c, idx_f] = intersect(c(:, 1:2) , f(:, 1:2), 'rows');
n = [c(idx_c, :), f(idx_f, end)];
这应该产生预期的结果:
n =
1.0000 6.0000 2.5200 3.9000
1.0000 9.0000 0.8800 9.1000
2.0000 0 2.5800 0.3000
2.0000 3.0000 0.5300 0.9000
2.0000 6.0000 3.6900 1.2000
2.0000 9.0000 0.1800 2.5000
3.0000 0 3.2200 2.7000
答案 4 :(得分:0)
如果没有任何for循环(除了本机代码)
mf = size(f,1);
mc = size(c,1);
a = repmat(c(:,1:2),1,mf);
b = repmat(reshape((f(:,1:2))',1,[]),mc,1);
match = a == b;
match = match(:, 1 : 2 : 2*mf) & match(:, 2 : 2 : 2*mf);
crows = nonzeros(diag(1:mc) * match);
frows = nonzeros(match * diag(1:mf));
n = [c(crows,:),f(frows,3)]