想象一下,我是一个像这样的空单元格:
dim = [100,200];
x = cell(dim);
我想用x
(字符串)替换'a'
的对角元素。这就是我所做的:
mask = logical(eye(dim));
x{mask} = {'a'};
但是,我收到以下错误:
此作业的右侧几乎没有值可满足 左手边
测试错误(第28行)
x {mask} = {' a'};
我也尝试过:
mask_2 = find(mask == true);
x{mask_2} = {'a'};
但我得到同样的错误。有什么方法可以解决这个问题吗?我希望脚本尽可能高效。
答案 0 :(得分:4)
要引用一组单元格,请使用Matlab文档中称为“平滑括号”的内容,或者我们称之为正常括号的内容:
http://www.mathworks.com/help/matlab/matlab_prog/access-data-in-a-cell-array.html
x(mask) = {'a'}
dim = [5,6]
的结果:
x =
{
[1,1] = a
[2,1] = [](0x0)
[3,1] = [](0x0)
[4,1] = [](0x0)
[5,1] = [](0x0)
[1,2] = [](0x0)
[2,2] = a
[3,2] = [](0x0)
[4,2] = [](0x0)
[5,2] = [](0x0)
[1,3] = [](0x0)
[2,3] = [](0x0)
[3,3] = a
[4,3] = [](0x0)
[5,3] = [](0x0)
[1,4] = [](0x0)
[2,4] = [](0x0)
[3,4] = [](0x0)
[4,4] = a
[5,4] = [](0x0)
[1,5] = [](0x0)
[2,5] = [](0x0)
[3,5] = [](0x0)
[4,5] = [](0x0)
[5,5] = a
[1,6] = [](0x0)
[2,6] = [](0x0)
[3,6] = [](0x0)
[4,6] = [](0x0)
[5,6] = [](0x0)
}
答案 1 :(得分:4)
我知道有两种方法可以做到这一点。
第一种是使用带括号的寻址代替括号。这将返回每个地址的单元数组引用,因此您必须为结果分配一个单元格数组:
x(mask) = {'a'};
第二种是使用括号寻址,它将返回以逗号分隔的列表。那是什么?您在Matlab中从未听说过comma-separated list?这是因为它是Matlab最不了解的数据类型,即使我向您保证您之前已经看过它。阅读链接以获取更多信息。我发现很多Matlab的怪异"一旦我理解了逗号分隔列表是什么以及它们在何处被使用,那就更有意义了。
无论如何,如果您尝试编写x{mask} = 'a'
,它将无法正常工作,因为您尝试将单个值分配给以逗号分隔的引用列表。您可以使用deal
函数通过使用一些聪明来连接引用来为每个引用分配:
[x{mask}] = deal('a');
你有它。使用逻辑索引分配给单元阵列的两种方法。我不确定哪个更快,你必须自己测试一下。
答案 2 :(得分:1)
除了这里给出的解释之外,您还可以避免创建(可能很大的)逻辑数组(如果这是唯一目的),并使用linear indexing直接使用sub2ind
分配值功能:
dim = [100,200];
x = cell(dim);
x(sub2ind(dim,1:dim(1),1:dim(1))) = {'a'};
正如评论中所提到的,sub2ind
函数很容易在这里,因为对角元素之间的步幅是一个常数值(行数)。所以上面的内容可以简化为
x(1:dim(1)+1:dim(1)^2) = {'a'};
答案 3 :(得分:1)
另一个选项(一个班轮,我最喜欢的解决方案),使用问题(eye
函数等)中提供的逻辑:
x=num2cell(char(eye(n,m)*97),n)
其中dim=[n,m]
和97
将为字符串'a'
编码...