【问题标题】:Add matrix to structure column without using for loop?将矩阵添加到结构列而不使用 for 循环?
【发布时间】:2015-11-10 11:43:19
【问题描述】:

是否可以在不使用 for 循环的情况下将矩阵添加到结构“列”中?例如,我有一个包含 3 个字段的结构

A.name
A.grade
A.attendance

现在A.attendance 需要一个 1x5 矩阵。如果我有一个 5x5 的矩阵,我可以直接将它插入到结构 A 的 5 行中吗?像

A(1:5).attendance = B

其中 B 是一个 5x5 矩阵

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    如果您的 B 实际上是一个 5 元素元胞数组,其中每个元素是一个 1-by-5 矩阵(实际上每个元素都可以包含任何内容),那么

    [A.attendance] = B{:}
    

    会起作用。您可以将 5-by-5 双矩阵 B 转换为所需的形式,如下所示:

    B_cell = mat2cell(B, ones(size(B,1),1),size(B,2))
    

    或跳过临时变量并使用deal:

    [A.attendance] = deal(mat2cell(B, ones(size(B,1),1),size(B,1)))
    

    【讨论】:

    • 所以你可以在没有{:}的单元格上直接使用deal。这些事情总是让我感到困惑!
    • @Luis 我猜这正是你所说的:{:} 本身就是一个隐含的deal。显式使用deal 允许您使用完整的单元格,deal 将为您处理它。
    • @Andras 我是这样看的:deal 允许您在 RHS 上使用“手动”定义的逗号分隔列表:[A(1:5).attendance] = deal(1,3,5,7,9);。没有deal,这是行不通的。但是,如果1,3,5,7,9 列表自动从单元数组C = {1,3,5,7,9} 生成为C{:},那么从Matlab 7.0 开始就不需要deal,即使C{:} 精确生成@987654342 @
    • 只是为了明确确认,我不能在结构中直接将双矩阵存储为双矩阵(如问题中所述)?
    【解决方案2】:

    您可以将B 转换为其行的元胞数组,

    C = mat2cell(B, ones(size(B,1),1), size(B,2))
    

    然后你可以分配如下

    [A(1:size(B,2)).attendance] = C{:};
    

    【讨论】:

    • 我只是在考虑deal的解决方案:)
    • 该死,我不应该打字这么久;)我认为您不需要A 上的索引,[A.attendance] 应该也可以工作
    • @Andras 实际上右侧有一个“隐式”deal。以前是必须的,现在不用了since version 7.0
    • @LuisMendo 当然,我意识到后验。但一切都太晚了;)
    • @Dan 这是个好主意,但前提是A 以前未定义或足够小。如果A 有多个size(B,1) 条目,则会报错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多