【问题标题】:Return subscripts of a variable dimension matrix返回可变维度矩阵的下标
【发布时间】:2012-01-18 22:02:38
【问题描述】:

我需要能够返回维度为 LxLxL..xL 的矩阵的元素的索引 [x1 x2 ... xd]。维数 d 是提供给我的函数的变量。该矩阵不存在,而是我有一个长度为 L^d 的线性数组。对于数组中的给定索引 i,我想知道矩阵中的等效索引。我已经可以使用一个简单的 for 循环来做到这一点,但我很想知道我是否可以以某种方式使用 ind2sub。我的问题是,如果我这样做了

x=zeros(1,d)
x=ind2sub(L,i)

x 被重新分配一个数字,而不是所有下标的数组。有没有办法做到这一点?

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

    我假设“索引 [x1 x2 ... xd]”是指沿等效 d 维数组的每个维度的下标。

    您需要将L和d转换为维度数组,然后从ind2sub捕获多个argout。这是一个这样做的函数。你可以这样称呼它x = myind2sub(L, d, i)

    function out = myind2sub(L, d, ix)
    
    sz = repmat(L, [1 d]); %// dimension array for a d-dimension array L long on each side
    c = cell([1 d]);  %// dynamically sized varargout
    [c{:}] = ind2sub(sz, ix);
    out = [c{:}];
    

    但是你也应该问为什么你将它存储在一个线性数组中并计算下标,而不是首先将它存储在一个多维数组中。在 Matlab 中,多维数组存储在连续的内存块中,因此效率很高,您可以使用多维下标或线性索引对其进行索引。如果你有一个线性数组,只需调用reshape(myarray, sz) 将其转换为多维等价物。

    【讨论】:

    • 谢谢!这是涉及到多个维度变化的模拟的一部分。
    • 那么你可以使用reshape();它很便宜,因为它只是扭曲了 mxarray 标头中的维度元数据;底层数据保留在内存中。实际上,Matlab 的数组支持已经完成了这些工作,并且在用户代码中重新实现它可能会使您的代码变慢。
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多