如何在MATLAB中循环输入一般数量的输入?

时间:2017-01-25 20:23:34

标签: matlab eval

我有一个(K x KM)矩阵A,其中矩阵的第一个(K x K)元素A_1是函数的第一个参数,最后一个M (K x K)元素A_M是函数的最后一个输入。

M是任意的,由矩阵A上的大小决定。

我需要的是用于评估的MATLAB代码:

blkdiag(A_1,A_2,...,A_M) 

我考虑使用sprintfeval的循环,但这似乎效率低下。我发现的一个有效的解决方案是:

B = kron(ones(1,M),A')
for ii=1:size(B,1)
  for jj=1:size(B,2)
    if ii+jj in off diagonal block
      B(ii,jj)=0;
    end
  end
end

但是我想要一些我不需要弄清楚循环的东西。

2 个答案:

答案 0 :(得分:3)

一种选择是使用mat2cell将单个矩阵收集到单元格数组的单独单元格中,然后将其作为blkdiag传递给comma-separated list

>> A = rand(3, 9)

A =

    0.6892    0.0838    0.1524    0.9961    0.1067    0.7749    0.0844    0.8001    0.1818
    0.7482    0.2290    0.8258    0.0782    0.9619    0.8173    0.3998    0.4314    0.2638
    0.4505    0.9133    0.5383    0.4427    0.0046    0.8687    0.2599    0.9106    0.1455

>> [r, c] = size(A);
>> B = mat2cell(A, r, r.*ones(1, c/r));
>> B = blkdiag(B{:})

B =

    0.6892    0.0838    0.1524         0         0         0         0         0         0
    0.7482    0.2290    0.8258         0         0         0         0         0         0
    0.4505    0.9133    0.5383         0         0         0         0         0         0
         0         0         0    0.9961    0.1067    0.7749         0         0         0
         0         0         0    0.0782    0.9619    0.8173         0         0         0
         0         0         0    0.4427    0.0046    0.8687         0         0         0
         0         0         0         0         0         0    0.0844    0.8001    0.1818
         0         0         0         0         0         0    0.3998    0.4314    0.2638
         0         0         0         0         0         0    0.2599    0.9106    0.1455

答案 1 :(得分:3)

这是另一种解决方案

crond[669]: (sh) ERROR (getpwnam() failed)