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.相关问题:据报道,看看这个。这是一个真正的错误。谢谢你的报道!