【问题标题】:How to create idendical variables in MATLAB from an array of variable names?如何在 MATLAB 中从变量名数组创建相同的变量?
【发布时间】:2019-12-21 22:27:49
【问题描述】:

我在 Matlab 中有以下代码:

a = zeros(23,1)
b = zeros(23,1)
c = zeros(23,1)

我怎样才能写得更紧凑?我正在寻找类似这样的解决方案:

str = {'a','b','c'}
for i = str{i}
    i = zeros(23,1)
end

但是如果没有错误消息,我找不到正确执行此操作的方法。有人可以帮忙吗?

【问题讨论】:

  • 第一个好,不用改。您也可以随时使用d=zeros(23,3) 并索引每个第二维。

标签: string matlab for-loop indexing


【解决方案1】:

这是使用deal 的简洁方式:

[a, b, c] = deal(zeros(23,1));

【讨论】:

    【解决方案2】:

    如果变量名很重要,您也可以使用struct:

    str = {'a','b','c'};
    data = struct
    for ii = 1:numel(str)
        data.(str{ii}) = zeros(23,1);
    end
    

    结构比表更有效。您现在可以联系data.a、data.b 等。

    但如果名称没有用,最好将数据放入元胞数组中:

    N = 3;
    data = cell(N,1);
    for ii = 1:N
        data{ii} = zeros(23,1);
    end
    

    或者简单地说:

    data = cell(3,1);
    [data{:}] = deal(zeros(23,1));
    

    现在您将数组寻址为data{1}、data{2} 等,它们总是很容易在循环中寻址。

    【讨论】:

    • 结构不一定比表更有效...这取决于你在做什么
    • @Wolfie:当然。但是如果A 是一个结构而不是一个表,A.field 的速度要快得多。表是一个用户类,因此对它进行索引会运行一些 M 文件代码。结构是一种内置类型。这里有一个问答,这两个是定时的。
    【解决方案3】:

    你想做的是非常糟糕的做法,但可以这样做

    str = {'a','b','c'};
    for ii = 1:numel(str)
        eval( [str{ii} ' = zeros(23,1)'] );
    end
    

    为什么这是不好的做法?

    • 您的代码可读性刚刚下降,您无法清楚地看到变量的声明位置。
    • evalshould be avoided

    您可以使用deal 使事情变得更好,但这不使用变量名数组

    [a, b, c] = deal( zeros(23, 1) );
    

    更好的是,您可能可以通过使用矩阵或表格而不是单独的一维数组来优化您的代码。 table 选项意味着你仍然可以使用你的变量名数组,但你没有使用 eval 做任何事情!

    % Matrix
    M = zeros( 23, 3 ); % Index each column as a/b/c using M(:,1) etc
    
    % Table, index using T.a, T.b, T.c
    T = array2table( zeros(23,3), 'VariableNames', {'a','b','c'} );     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 2021-12-22
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多