Arrays 在Matlab中将矩阵中的元素i,j设置为i*j

Arrays 在Matlab中将矩阵中的元素i,j设置为i*j,arrays,matlab,matrix,Arrays,Matlab,Matrix,我想生成一个矩阵,其中I,j元素等于I*j,其中I!=j e、 g 到目前为止,我发现我可以通过这个索引矩阵访问非对角元素 idx = 1 - eye(3) 但我还没有弄清楚如何将矩阵单元的索引合并到计算中。我正在考虑一般情况(矩阵不一定是正方形)。让 有很多方法: 使用ndgrid: [ii jj] = ndgrid(1:m,1:n); result = (ii.*jj).*(ii~=jj); 使用bsxfun: result = bsxfun(@times, (1:m).',1:n)

我想生成一个矩阵,其中I,j元素等于I*j,其中I!=j

e、 g

到目前为止,我发现我可以通过这个索引矩阵访问非对角元素

idx = 1 - eye(3)

但我还没有弄清楚如何将矩阵单元的索引合并到计算中。

我正在考虑一般情况(矩阵不一定是正方形)。让

有很多方法:

  • 使用
    ndgrid

    [ii jj] = ndgrid(1:m,1:n);
    result = (ii.*jj).*(ii~=jj);
    
  • 使用
    bsxfun

    result = bsxfun(@times, (1:m).',1:n) .* bsxfun(@ne, (1:m).',1:n);
    
  • 使用
    repmat
    cumsum

    result = cumsum(repmat(1:n,m,1));
    result(1:m+1:m^2) = 0;
    
  • 使用矩阵乘法(由@GastónBengolea添加):

  • 怎么样

    N=3;  %size of matrix
    A=[1:N]'*[1:N]-diag([1:N].^2)
    

    还有一个技巧是滥用该功能:

    >> m = 4;
    >> n = 3;
    >> a = kron((1:m)', 1:n);
    >> a(eye(m, n, 'logical')) = 0
    
    a =
    
        0    2    3
        2    0    6
        3    6    0
        4    8   12
    

    你应该预先分配
    A=0(3)
    使代码更快(然后,如果,您可以删除
    的第一个分支)。此外,
    for
    循环在MatlabI中,我同意@LuisMendo。另外,这段代码不起作用(
    A[i j]
    什么都不是。我想你的意思是
    A[i,j]
    ),所以答案不是一个完整的答案。任何不是直接矩阵运算、后处理或工具箱的东西都不是MatLab中的最佳选择。但除非他计划创建一个非常大的矩阵,否则这就行了=D@user3277173还有其他在Matlab中运行良好的选项:
    bsxfun
    ndgrid
    例如,您是对的,sebas。我的MatLab技能真的很生疏@Luis Mendo、bsxfun和ndgrid只是设置矩阵的示例,这些矩阵足以直接操作。对于这一点,是的,对于
    kron
    ,循环+1的效率要高得多。嘿,为什么
    a(1:m+1:end)=0
    很傻?;-)无论如何,如果n>m,它可能不起作用(但我不认为这就是为什么你这么说)。你需要
    a(1:m+1:min(m,n)^2)=0
    你是对的,
    m^2
    就足够了。我已经更新了我的答案,只是为了一个正方形矩阵。+1在我看来是最优雅的解决方案。我甚至会使用:
    [1:N]'*[1:N].~diag([1:N])
    result = (1:m).'*(1:n).*~eye(m,n);
    
    N=3;  %size of matrix
    A=[1:N]'*[1:N]-diag([1:N].^2)
    
    for i=1:3
        for j=1:3
            if i==j
               A(i,j)=0;
            else
               A(i,j)=i*j;
            end
        end
    end
    
    >> m = 4;
    >> n = 3;
    >> a = kron((1:m)', 1:n);
    >> a(eye(m, n, 'logical')) = 0
    
    a =
    
        0    2    3
        2    0    6
        3    6    0
        4    8   12