【问题标题】:How can I assign a value to the diagonals of a 4-D matrix using linear indexing in MATLAB?如何在 MATLAB 中使用线性索引为 4-D 矩阵的对角线赋值?
【发布时间】:2011-07-16 04:56:56
【问题描述】:

我有一个大小为 NxNxPxQ 的 4 维矩阵 A。如何以矢量化方式轻松地将每个NxN 2-D 子矩阵的对角线值更改为 1?

【问题讨论】:

    标签: matlab multidimensional-array matrix variable-assignment diagonal


    【解决方案1】:

    结合 gnovice 的建议,索引元素的简单方法是:

    [N,~,P,Q]=size(A);%# get dimensions of your matrix
    
    diagIndex=repmat(logical(eye(N)),[1 1 P Q]);%# get logical indices of the diagonals    
    A(diagIndex)=1;%# now index your matrix and set the diagonals to 1.
    

    【讨论】:

    • 您实际上可以通过将单位矩阵创建为逻辑矩阵,然后进行逻辑索引来避免使用 FIND:diagIndex = repmat(logical(eye(dim1)),[1 1 dim3 dim4]);
    【解决方案2】:

    您可以使用直接索引,以及对 repmat 进行一些处理,将单个 50x50 对角线的索引添加到每个 50x50 块的较大矩阵内的偏移量:

    下面是一个小问题的例子:

    A = NaN(10,10,5,3);
    inner = repmat(sub2ind([10 10], [1:10],[1:10]), 5*3, 10); % diagonals
    outer = repmat([10*10 * [0:5*3-1]]', 1, 10*10); % offsets to blocks
    diags = inner + outer;
    A(diags(:)) = 1;
    

    【讨论】:

      【解决方案3】:

      您实际上可以通过直接计算每个对角元素的线性索引,然后将它们设置为 1 来非常简单地做到这一点:

      [N,N,P,Q] = size(A);
      diagIndex = cumsum([1:(N+1):N^2; N^2.*ones(P*Q-1,N)]);
      A(diagIndex) = 1;
      

      上面的示例为第一个 N-by-N 矩阵 (1:(N+1):N^2) 找到了 N 对角线索引。每个后续的N-by-N 矩阵(其中P*Q-1)都被N^2 元素从最后一个元素偏移,因此大小为PQ-1-by-N 的矩阵仅包含值@987654333 @ 附加到第一个矩阵的对角线的线性索引。当使用函数CUMSUM 对每一列执行累积求和时,生成的矩阵包含 4-D 矩阵的所有对角线元素的线性索引。

      【讨论】:

        猜你喜欢
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 2017-05-18
        • 1970-01-01
        • 2021-11-15
        • 2015-01-21
        相关资源
        最近更新 更多