【问题标题】:How to take part of matrix if unknown number of dimension in Matlab? [duplicate]如果 Matlab 中的维数未知,如何参与矩阵? [复制]
【发布时间】:2013-06-20 07:13:29
【问题描述】:

假设我想做类似的事情

image(1:end-1,2:end,:)

这里是彩色图像的一部分

但维度数未知,即会像这样自动工作

image(1:end-1,2:end)

二维

image(1:end-1,2:end,:)

对于 3 和

image(1:end-1,2:end,:,:)

对于 4 等等。

【问题讨论】:

    标签: matlab matrix submatrix


    【解决方案1】:

    如果你总是想把所有的 3rd 暗淡和向上,你可以使用

    >> image(1:end-1,2:end,:,:,:)
    

    即使是二维数组。

    或者,您可以使用subsref 来减少临时/hacky 方法:

    >> [S.subs{1:ndims(image)}] = deal(':');
    >> S.subs{1} = '1:end-1';
    >> S.subs{2} = '2:end';
    >> S.type = '()';
    >> subsref(image, S )
    

    【讨论】:

    • Shai 为 使用 bsxfun! 的 MATLAB 问题提供了解决方案? :)
    • @DangKhoa 不要忘记我有一个后台进程在循环中运行bsxfun(矢量化循环) - 所以我的每个解决方案都有bsxfun(甚至是押韵;)
    【解决方案2】:

    对于这个案例,我有两个想法。

    第一种方式: 您之前可以重塑您的图像,例如

    % transform image to 3d format
    % do not forget to transform all used entities to this 3d-format as well
    sizeIm = size(image);
    image3 = reshape(image,[sizeIm(1:2),prod(sizeIm(3:end)])
    
    % work on image3
    image3(1:end-1,2:end,:) = ...;
    
    % transform back:
    image = reshape(image3,sizeIm);
    

    第二种方式: 可能是使用evalrepmat 的解决方案,例如

    eval(['image(1:end-1,2:end',repmat(',:',[1,length(size(image))-2]) ')'])
    

    取决于您使用它的目的(设置、获取...)。

    【讨论】:

    • -1 用于评估。代码已经不容易阅读,eval() 将是一场噩梦。
    • 哇...这很“公平”!这只是一个建议。你知道他想在哪里以及如何使用它吗?
    • 在 99% 的情况下,我对 eval() 的解决方案投了反对票(我会在以后更新我的描述,说明原因)。
    • 我自己知道很多反对 eval 的论据,但我给出了 2 个或多或少有用的答案,你当然不必赞成,但警告评论反对第二个方式已经绰绰有余了。
    • 另一方面,重塑很好。
    【解决方案3】:

    我有一点想法。您可以制定一个函数,使用size(size(Matrix),2) 分析矩阵的维度。然后你可以构造一个字符串,其中包含你想要的命令和一个小的 for 循环,然后你用 eval 执行这个字符串。

    A=rand(3,3,3,3,3,3,3,3,3,3) %<--- change here dimension
    
    dim=size(size(A),2)
    
    addstr='';
    if dim>2
        for i=1:dim-2
            addstr=[addstr ',:'];
        end
    end
    
    command=['A(1:2,1:2' addstr ')']
    
    eval(command)
    

    【讨论】:

    • 嘿,我在 15 分钟前在一行中发布了这个。我想奥列格很快就会对你投反对票 ;-)
    • @matheburg 你是对的。因为我认为这不是一个坏主意,所以我再次投票给你 ;-)
    【解决方案4】:

    假设你有一个数组A:

    A  = rand(2,3,2,5,7);
    

    然后,您可以填写':',您选择的剩余维度:

    nd   = ndims(A);
    subs = repmat({':'},1,nd-2);
    A(1:end-1,2:end, subs{:})
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2014-11-26
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多