在matlab中使用循环和条件组合矩阵

时间:2013-03-24 20:18:33

标签: matlab loops matrix conditional-statements

我有以下两个矩阵

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

任何人都可以帮我这个吗? 还有更简单的东西吗?

提前致谢

5 个答案:

答案 0 :(得分:1)

根据this对Mathworks支持的回答,您可以使用统计工具箱中的join,特别是在您的情况下,使用内部联接。

不幸的是我没有使用matlab访问我的计算机,但请试一试,让我们知道它是如何工作的。

答案 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找到cf中的公共行,其索引在idx_cidx_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)]