【问题标题】:Is there an idiomatic way to exchange two elements in a cell array?是否有一种惯用的方式来交换单元数组中的两个元素?
【发布时间】:2014-09-08 11:16:00
【问题描述】:

我知道我可以这样写:

tmp = arr{i}
arr{i} = arr{j}
arr{j} = tmp

但是有更简单的方法吗?例如,在 Python 中我会写:

arr[i], arr[j] = arr[j], arr[i]

【问题讨论】:

    标签: arrays matlab cell-array


    【解决方案1】:

    标准的惯用方式

    使用索引向量:

    arr([i j]) = arr([j i]); %// arr can be any array type
    

    无论arr 是元胞数组、数值数组还是字符串(字符数组),这都有效。


    不推荐(但可能):

    如果您想使用更类似于 Python 中的语法(使用 元素列表 而不是索引向量),则需要 deal 函数。但是生成的语句更复杂,并且取决于arr 是元胞数组还是标准数组。所以不推荐(用于交换两个元素)。我只是为了完整性才包含它:

    [arr{i}, arr{j}] = deal(arr{j}, arr{i}); %// for a cell array
    [arr(i), arr(j)] = deal(arr(j), arr(i)); %// for a numeric or char array
    

    【讨论】:

    • 谢谢,这正是我要找的。由于没有真正的 MATLAB 经验,我对所有不同类型的括号、何时使用它们等等感到非常困惑。感谢您回答这么简单的菜鸟问题。
    • 我在 Matlab 方面有相当多的经验,但也很困惑,特别是花括号。所以不要为此感到气馁:-)
    • @DavidHeffernan 这是迷你教程:方括号[] 用于连接成数组,圆括号() 用于函数调用和访问元素,大括号{} 用于访问内容(主要与元胞数组相关)并串联成元胞数组。
    【解决方案2】:

    不要混淆,让我换一种语法:

    [arr{[i,j]}] = arr{[j,i]};
    

    [arr{i},arr{j}] = arr{[j,i]};
    

    这里的想法是使用带有花括号索引的comma-separated lists

    请记住,在使用元胞数组时,()-indexing 会为您提供sliced 元胞数组,而{}-indexing 从元胞数组中提取元素,返回类型是存储在指定单元格(当索引为非标量时,MATLAB 以逗号分隔列表的形式单独返回每个单元格内容)。

    【讨论】:

    • 好地方,这也是一个值得一提的替代方案
    猜你喜欢
    • 2012-10-09
    • 2011-08-24
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多