gpt4 book ai didi

matrix - 为什么这个 Octave 代码不起作用?

转载 作者:行者123 更新时间:2023-12-04 14:56:41 24 4
gpt4 key购买 nike

Y是一个长度为 N 的向量,包含来自 1 的数字至 10 .作为示例代码,您可以使用:

Y = vec(1:10);

我正在编写必须创建 N x 10 的代码矩阵,每一行都由除 1 以外的所有零组成仅在向量中的数字对应的位置 Y .因此, 1Y变成 10000000000 , 3变成 0010000000 , 等等。

这种方法有效:

cell2mat(arrayfun(@(x)eye(10)(x,:), Y, 'UniformOutput', false))

我的下一个想法是“优化”,所以 eye(10)未生成 N次,我写了这个:

theEye = eye(10);
cell2mat(arrayfun(@(x)theEye(x,:), Y, 'UniformOutput', false))

但是,现在 Octave 给了我错误:

error: can't perform indexing operations for diagonal matrix type
error: evaluating argument list element number 1

为什么我会收到这个错误?怎么了?

额外的问题——你认为有更好的方法来做我正在做的事情吗?我的优化尝试是否让 Octave 变得更容易?

最佳答案

我在 Octave 和 eye 中运行了这段代码创建一个称为 Diagonal Matrix 的类(或任何类)的矩阵:

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

事实上,Octave 的文档说,如果矩阵是对角矩阵,则会创建一个特殊对象来处理对角矩阵而不是标准矩阵: https://www.gnu.org/software/octave/doc/interpreter/Creating-Diagonal-Matrices.html

有趣的是,我们可以在 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 中为每个元素返回一个元素元胞数组将这些切片存储到每个元胞数组元素中时,可能会出现问题。

然而,这似乎也不是罪魁祸首。我取了 theEye的前三排,将它们放入一个元胞数组并使用 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(请参阅上面的评论),这确实是一个错误,并已报告: https://savannah.gnu.org/bugs/?47510 .还可以提供见解的是,此代码在 MATLAB 中按预期运行。

无论如何,您可以从中获得的一件事是我会认真避免使用 cell2mat .只需使用直接索引:
Y = vec(1:10);
theEye = eye(10);
out = theEye(Y,:);

这将索引到 theEye并提取存储在 Y 中的相关行并创建一个矩阵,其中除了每个元素中看到的相应值之外,每一行都为零 Y .

另外,看看这个帖子的类似例子: Replace specific columns in a matrix with a constant column vector

但是,它是在列而不是行上定义的,但这与您想要实现的非常相似。

关于matrix - 为什么这个 Octave 代码不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36182328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com