【问题标题】:Apply matrix operation to every k-dim row in an n-dim matrix将矩阵运算应用于 n-dim 矩阵中的每个 k-dim 行
【发布时间】:2013-07-07 19:32:24
【问题描述】:

octave 是否有一种方法,您可以通过该方法获取适用于二维矩阵中每一列的函数并将其转换为适用于沿 n 维矩阵中第 k 维的每一行的函数?

例如,这里我有一个函数可以缩放矩阵中的每一列,使最小值为零,最大值为一:

function [res] = normalizeColRange(m)
    nrows = size(m,1);

    maxes = max(m,[],1);
    mins = min(m,[],1);

    res = [speye(nrows), -ones(nrows,1)] * [m; mins] / diag(maxes - mins);
endfunction

现在我正在寻找一个函数(我称之为operatedDim),如果我想以同样的方式缩放4维矩阵(m)中的每条dim-3线,我可以说:

res = operateDim(@normalizeColRange,m,3);

并返回一个相同大小的 4 维矩阵,其中所有条目都沿 3 维缩放。换句话说:

min(res,[],3) == 0

max(res,[],3) == 1

一个更简单的输入函数就是矩阵乘法。即:

res = operateDim(@(M) A * M, m, 3)

将 m 的每 d-3 行视为矩阵中的一列,并适当地将 A 乘以该列,以便

reshape(permute(res,[3,1,2,4]),size(res,3),[]) ==
A * reshape(permute(m,[3,1,2,4]),size(m,3),[])

【问题讨论】:

    标签: multidimensional-array matrix function-pointers octave matrix-multiplication


    【解决方案1】:

    这是我创建operatedDim 的尝试。它似乎有些冗长,我想知道它是否适合更通用的范例,或者八度库中是否已经存在这样的函数:

    function [res] = operateDim(f,m,d):
        p = 1:ndims(m);
        p([1,d]) = [d,1];
        m = permute(m, p);
        nsizes = size(m);
        m = reshape(m, nsizes(1), []);
        res = f(m);
        assert(ndims(res) <= 2);
        nsizes(1) = size(res,1);
        assert(size(res,2) == size(m,2));
        res = reshape(res, nsizes);
        res = permute(res, p);
    endfunction
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2013-06-23
      • 2014-07-10
      • 1970-01-01
      • 2019-10-04
      相关资源
      最近更新 更多