【问题标题】:Subscripted assignment dimension mismatch. error in matlab下标分配尺寸不匹配。 matlab中的错误
【发布时间】:2015-06-24 12:00:34
【问题描述】:
    for i=1:30
  Name(i,1)=sprintf('String_%i',i);
end

我只是对这里不起作用的东西感到困惑,这个脚本看起来很简单,wnat 构建一个编号从 1 到 30 的字符串列表。得到错误

下标分配维度不匹配。

【问题讨论】:

  • 尝试使用元胞数组,它可以工作:Name{i,1} = ...。您不能将字符串存储到常规数值数组中。您也可以使用sprintfc 来表示单行:Name = sprintfc('String_%i',1:30)

标签: matlab


【解决方案1】:

Matlab 没有真正的字符串,它们有 char 数组。与几乎任何编程语言一样,Matlab 无法在不知道要分配多少内存的情况下定义变量。 Java 解决方案如下所示:

String str[] = {"I","am","a","string"};

类似于c++的解决方案:

std::string str[] = {"I","am","another","string"};

c 的解决方案看起来不同,但通常与 c++ 中的解决方案相同:

const char* str[] = {"I","am","a","c-type","string"};

然而,尽管表面上看,这些在本质上都是相同的,因为它们都知道要分配多少数据,即使它们不会被启动。特别是你可以写:

String str[3];
// Initialize element with an any length string.

原因是存储在每个元素中的内存在java中通过其引用存储,在c和c++中通过指针存储。因此,根据操作系统,每个元素是 4(32 位)或 8(64 位)字节。

但是,在 Matlab 矩阵中,数据是按值存储的。这使得无法将N 字符数组存储在1xNNx1 矩阵中。矩阵中的每个元素只允许与 char 大小相同且为 char 类型。这意味着,如果您使用字符串,则需要使用数据结构 cell(也由 Benoit_11 建议),它在每个元素中存储对任何 Matlab 对象的引用。

k = 1:30;
Name = cell(length(k),1);
for i=k
    Name{i,1}=sprintf('String_%i',i);
end

希望解释对您有意义。我假设根据您的尝试,您至少有一些编程经验,至少使用过 matlab 以外的一种语言。

【讨论】:

  • 很好的解释!我认为您在循环中缺少花括号;否则有错误。 IE。使用Name{i,1} = ...... = { sprintf(...)}
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 2013-12-23
  • 2017-10-28
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多