gpt4 book ai didi

matlab - Octave 和 Matlab "wat"矩阵/向量不一致

转载 作者:太空宇宙 更新时间:2023-11-03 19:47:37 26 4
gpt4 key购买 nike

我注意到 Matlab 和 Octave 中的各种情况,其中函数接受矩阵和向量,但对向量的处理与对矩阵的处理不同。

这可能会令人沮丧,因为当您输入一个行数/列数可变的矩阵时,它可能会被解释为一个向量,并在高度/宽度为 1 时做一些您不期望的事情,这使得调试变得困难并且很奇怪条件边界情况。

我会列出一些我发现的,但我很好奇其他人遇到了什么

(注意:我只是在寻找代码接受矩阵作为有效输入的情况。任何在给出非向量矩阵作为参数时引发异常的都不算数)

1)“diag”可用于表示矩阵的对角线或将向量转换为对角矩阵

由于前者通常仅用于方矩阵,这在 matlab 中并不是那么令人震惊,但在 Octave 中,当 Octave interperets 一个以非零元素开头且其他所有元素都为零的向量作为“对角矩阵”时,它可能特别痛苦即

t=eye(3);
size(diag(t(:,3))) == [3,3]
size(diag(t(:,2))) == [3,3]
size(diag(t(:,1))) == [1,1]

2) 用逻辑索引到一个行向量中返回一个行向量

使用逻辑索引到任何其他内容都会返回一个列向量

a = 1:3;
b = true(1,3);
size(a(b)) == [1, 3]
a = [a; a];
b = [b; b];
size(a(b)) == [6, 1]

3) 使用索引向量 i 对向量 v 进行索引会返回与 v 具有相同(行/列)类型的向量。但是如果 v 或 i 是矩阵,则返回值的大小与 i 相同。

a = 1:3;
b = a';
size(a(b)) == [1, 3]
b = [b,b];
size(a(b)) == [3, 2]

4) max、min、sum 等分别对矩阵 M 的列进行运算,除非 M 为 1xn,在这种情况下,它们将 M 作为单个行向量进行运算

a = 1:3
size(max(a)) == [1, 1]
a = [a;a]
size(max(a)) == [1, 3]

max 特别糟糕,因为它甚至不能将维度作为参数(与 sum 不同)

在编写octave/matlab代码时还应该注意哪些此类情况?

最佳答案

每种语言都有自己的概念。这种语言的一个重点是经常将矩阵视为向量数组,每一列一个条目。那时事情就会开始变得有意义了。如果您不想要这种行为,请使用 matrix(:) 作为那些将传递单个向量而不是矩阵的函数的参数。例如:

octave> a = magic (5);
octave> max (a)
ans =

23 24 25 21 22

octave> max (a(:))
ans = 25

1) 至少 Octave 3.6.4 不是这样。我不是 100% 确定,但可能与 this bug 有关已经修复了。

2) 如果您使用 bool 值进行索引,它将被视为掩码并被视为掩码。如果您使用非 bool 值进行索引,那么它将被视为值的索引。这对我来说非常有意义。

3) 这不是真的。返回的索引始终具有相同的大小,无论它是矩阵还是向量都是独立的。唯一的异常(exception)是,如果索引是向量,则输出将是单行。这个想法是,使用单个向量/矩阵进行索引会返回相同大小的内容:

octave> a = 4:7
a =

4 5 6 7

octave> a([1 1])
ans =

4 4

octave> a([1 3])
ans =

4 6

octave> a([1 3; 3 1])
ans =

4 6
6 4

4) max 至少在 Octave 中确实将维度作为参数。来自 max 的 3.6.4 帮助文本:

For a vector argument, return the maximum value. For a matrix argument, return the maximum value from each column, as a row vector, or over the dimension DIM if defined, in which case Y should be set to the empty matrix (it's ignored otherwise).

其余部分适用,就像我在介绍中所说的那样。如果您提供一个矩阵,它会将每一列视为一个数据集。

关于matlab - Octave 和 Matlab "wat"矩阵/向量不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16113121/

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