【问题标题】:Convert integer to logical array in MATLAB在MATLAB中将整数转换为逻辑数组
【发布时间】:2016-05-09 00:44:16
【问题描述】:

我想将整数 i 转换为具有第 i 个非零元素的逻辑向量。这可以用1:10 == 2 完成,它返回

0     1     0     0     0     0     0     0     0     0

现在,我想为每一行向量化这个过程。写repmat(1:10, 2, 1) == [2 5]'我希望得到

0     1     0     0     0     0     0     0     0     0
0     0     0     0     1     0     0     0     0     0

但是,这个错误发生了:

使用 == 时出错
矩阵尺寸必须一致。

我可以对这个过程进行矢量化处理吗,或者for 循环是唯一的选择吗?

【问题讨论】:

  • @johnny5 不是,但它的格式不正确且不清楚。下面烧杯的答案阐明了 OP 想要什么,甚至是话题。
  • 一般来说,请注意不要将 1 和 0 视为逻辑值。考虑:>> foo = 1:10; >> foo([1,0,1,0,1,0,1,0,1,0]) Subscript indices must either be real positive integers or logicals. >> foo(logical([1,0,1,0,1,0,1,0,1,0])) ans = 1 3 5 7 9

标签: arrays matlab indexing


【解决方案1】:

你可以使用bsxfun:

>> bsxfun(@eq, 1:10, [2 5].')
ans =

   0   1   0   0   0   0   0   0   0   0
   0   0   0   0   1   0   0   0   0   0

注意第二个向量上的转置.';这很重要。

【讨论】:

  • 通灵者徽章,+1 ;)
  • @AndrasDeak 我一直在和我的绝地训练师一起锻炼。
  • 对于使用八度的人,broadcasting 允许简单地写(1:10) == [2 5].'
  • @ederag 非常正确,我实际上在 Octave 上生成了上面的示例。但我不想混淆,因为这个问题只标记了 MATLAB 而不是 Octave。
【解决方案2】:

另一种方法是使用eye 并创建一个长为n x n 的逻辑矩阵,然后使用索引对该矩阵的行进行索引:

n = 10;
ind = [2 5];

E = eye(n,n) == 1;
out = E(ind, :);

我们得到:

>> out

out =

     0     1     0     0     0     0     0     0     0     0
     0     0     0     0     1     0     0     0     0     0

【讨论】:

    【解决方案3】:

    使用索引的另一种可能性:

    n = 10;
    ind = [2 5];
    x=zeros(numel(ind),n);
    x(sub2ind([numel(ind),n],1:numel(ind),ind))=1;
    

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 1970-01-01
      • 2017-09-15
      • 2023-03-23
      • 1970-01-01
      • 2023-03-18
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多