使用逻辑矩阵选择单元格的元素

时间:2015-06-29 21:59:38

标签: arrays matlab cell-array

想象一下,我是一个像这样的空单元格:

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'};

但我得到同样的错误。有什么方法可以解决这个问题吗?我希望脚本尽可能高效。

4 个答案:

答案 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'编码...