Matrix 为什么这个八度音阶编码赢了';不行?

Matrix 为什么这个八度音阶编码赢了';不行?,matrix,octave,Matrix,Octave,设Y为长度N的向量,包含从1到10的数字。作为示例代码,您可以使用: Y=vec(1:10); 我正在编写代码,该代码必须创建一个nx10矩阵,每行由除1之外的所有零组成,仅在与向量Y中的数字对应的位置。因此,Y中的1变为1000000000,3变为0010000000,依此类推 这种方法在以下方面起作用: cell2mat(arrayfun(@(x)眼(10)(x,:),Y,'UniformOutput',false)) 我的下一个想法是“优化”,所以eye(10)不会被生成N次,我写了以

Y
为长度
N
的向量,包含从
1
10
的数字。作为示例代码,您可以使用:

Y=vec(1:10);
我正在编写代码,该代码必须创建一个
nx10
矩阵,每行由除
1
之外的所有零组成,仅在与向量
Y
中的数字对应的位置。因此,
Y
中的
1
变为
1000000000
3
变为
0010000000
,依此类推

这种方法在以下方面起作用:

cell2mat(arrayfun(@(x)眼(10)(x,:),Y,'UniformOutput',false))
我的下一个想法是“优化”,所以
eye(10)
不会被生成
N次,我写了以下内容:

theEye=眼睛(10);
cell2mat(arrayfun(@(x)theEye(x,:),Y,'UniformOutput',false))
但是,现在倍频程给了我一个错误:

错误:无法对对角矩阵类型执行索引操作
错误:正在计算参数列表元素编号1
为什么会出现此错误?怎么了?


奖金问题-你认为有更好的方法来做我正在做的事情吗?我是在尝试优化使八度音阶更简单吗?

我在八度音阶中运行了这段代码,并且
eye
创建了一个称为
对角矩阵的类矩阵(或其他什么):

octave:3> theEye = eye(10);
octave:4> theEye
theEye =

Diagonal Matrix

   1   0   0   0   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0   0
   0   0   1   0   0   0   0   0   0   0
   0   0   0   1   0   0   0   0   0   0
   0   0   0   0   1   0   0   0   0   0
   0   0   0   0   0   1   0   0   0   0
   0   0   0   0   0   0   1   0   0   0
   0   0   0   0   0   0   0   1   0   0
   0   0   0   0   0   0   0   0   1   0
   0   0   0   0   0   0   0   0   0   1
事实上,倍频程的文档中说,如果矩阵是对角的,则会创建一个特殊对象来处理对角矩阵,而不是标准矩阵:

有趣的是,我们可以在
arrayfun
调用之外将这个矩阵切分,而不管它在单独的类中

octave:1> theEye = eye(10);
octave:2> theEye(1,:)
ans =

Diagonal Matrix

   1   0   0   0   0   0   0   0   0   0
但是,一旦我们将其放入
arrayfun
调用中,它就决定退出:

octave:5> arrayfun(@(x)theEye(x,:), 1:3, 'uni', 0)
error: can't perform indexing operations for diagonal matrix type
这对我来说没有任何意义,特别是因为我们可以在
arrayfun
之外对其进行切片。有人可能会怀疑它与
arrayfun
有关,因为您将
UniformOutput
指定为false,所以在
Y
中每个元素都会返回一个元素的单元格数组,并且在将这些切片存储到每个单元格数组元素中时可能出现了问题

然而,这似乎也不是罪魁祸首。我取了眼
的前三行,将它们放入一个单元格数组,并使用
cell2mat
将它们合并在一起:

octave:6> cell2mat({theEye(1,:); theEye(2,:); theEye(3,:)})
ans =

   1   0   0   0   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0   0
   0   0   1   0   0   0   0   0   0   0
因此,我怀疑这可能是某种内部错误(如果你可以这样称呼它的话…)。多亏了用户carandraug(参见上面的评论),这确实是一个bug,并且已经有报告:。还可以提供见解的是,该代码在MATLAB中按预期运行

在任何情况下,你都可以从中得到一件事,那就是我会认真地避免使用
cell2mat
。只需使用直接索引:

Y = vec(1:10);
theEye = eye(10);
out = theEye(Y,:);
这将索引到
ye
中,提取出存储在
Y
中的相关行,并创建一个矩阵,其中除每个元素
Y
中看到的对应值外,每一行都为零

另外,请看这篇文章中类似的例子:


然而,它是在列而不是行上定义的,但是它与您想要实现的非常相似;我们从数据开始:

>> len = 10;                % max number
>> vec = randi(len, [1 7])  % vector of numbers
vec =
     1    10     9     5     7     3     6
现在,我们构建指标矩阵:

>> I = full(sparse(1:numel(vec), vec, 1, numel(vec), len))
I =
     1     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     1
     0     0     0     0     0     0     0     0     1     0
     0     0     0     0     1     0     0     0     0     0
     0     0     0     0     0     0     1     0     0     0
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     0     1     0     0     0     0

@SerhiiYakovenko不客气:)老实说,我不知道为什么会发生错误。。。但我建议只索引到矩阵的行中。效率更高。非常感谢!我不知道我们可以用索引做到这一点:)@SerhiiYakovenko不客气。我不确定我是否回答了你的问题。。。但是我做了一些实验来解决这个问题。我把它归因于一些内部错误(如果你可以这么称呼它的话…。
sparse
是我的另一个选择,如果不是为了索引到身份矩阵中的话+1.相关问题:据报道,看看这个。这是一个真正的错误。谢谢你的报道!