标签: matrix

将3d矩阵重塑为2d矩阵

n-by-m-by-t在MATLAB中有一个3d矩阵()表示n-by-m一段时间内网格中的测量值.我想有一个二维矩阵,其中空间信息不见了,只有n*m随着时间的推移测量t留(即:n*m-by-t)

我怎样才能做到这一点?

matlab matrix reshape

23
推荐指数
2
解决办法
6万
查看次数

Ruby:条件矩阵?多个条件的情况?

在红宝石中,我想知道是否有办法做到以下几点:

我基本上有一个包含四种可能结果的矩阵:

A is True, B is True
A is True, B is False
A is False, B is True
A is False, B is False
Run Code Online (Sandbox Code Playgroud)

我想以最干净的"红宝石方式"为此写一个测试.

我希望做类似的事情

case[A,B]
  when A && B then ...
  when A && !B then ...
  when !A && B then ...
  when !A && !B then ...
end
Run Code Online (Sandbox Code Playgroud)

......但这不起作用.那么,处理这种情况的最佳方法是什么?

ruby conditional matrix switch-statement

23
推荐指数
3
解决办法
2万
查看次数

为什么numpy.linalg.solve()提供比numpy.linalg.inv()更精确的矩阵反转?

我不太明白为什么numpy.linalg.solve()给出更准确的答案,而numpy.linalg.inv()在某种程度上分解,给出(我相信的)估计.

举一个具体的例子,我正在求解方程式C^{-1} * d ,其中C表示一个矩阵,并且d是一个向量数组.为了便于讨论,尺寸C是形状(1000,1000)d形状(1,1000).

numpy.linalg.solve(A, b)求解A*x=bx 的等式,即x = A^{-1} * b.因此,我可以通过求解这个等式

(1)

inverse = numpy.linalg.inv(C)
result = inverse * d
Run Code Online (Sandbox Code Playgroud)

或(2)

numpy.linalg.solve(C, d)
Run Code Online (Sandbox Code Playgroud)

方法(2)给出了更精确的结果.为什么是这样?

究竟发生了什么,使一个"比另一个更好"?

python arrays numpy matrix linear-algebra

23
推荐指数
1
解决办法
1万
查看次数

C中的优化矩阵乘法

我正在尝试比较矩阵乘法的不同方法.第一个是常规方法:

do
{
    for (j = 0; j < i; j++)
    {
        for (k = 0; k < i; k++)
        {
            suma = 0;
            for (l = 0; l < i; l++)
                suma += MatrixA[j][l]*MatrixB[l][k];
                MatrixR[j][k] = suma;
            }
        }
    }
    c++;
} while (c<iteraciones);
Run Code Online (Sandbox Code Playgroud)

第二个包括首先转置矩阵B然后按行进行乘法运算:

int f, co;
for (f = 0; f < i; f++) {
    for ( co = 0; co < i; co++) {
        MatrixB[f][co] = MatrixB[co][f];
    }
}

c = 0;
do
{
    for (j …
Run Code Online (Sandbox Code Playgroud)

c matrix

22
推荐指数
5
解决办法
5万
查看次数

有效地计算矩阵中元素的总和

在一次采访中,我被问到是否给了一个n*m矩阵如何计算给定子矩阵中值的总和(由左上角,右下角坐标定义).

我被告知我可以预处理矩阵.

我被告知矩阵可能很大,子矩阵也是如此,因此算法必须高效.我偶然发现了一些并没有被告知最佳答案.

有谁有一个很好的答案?

algorithm matrix

22
推荐指数
2
解决办法
2万
查看次数

MATLAB中[]和[1x0]之间的差异

我在MATLAB中有一个循环,用我的工作区(2011b,Windows 7,64位)填充单元格数组,其中包含以下条目:

my_array = 
    [1x219 uint16]
    [         138]
    [1x0   uint16] <---- row #3
    [1x2   uint16]
    [1x0   uint16]
    []             <---- row #6
    [         210]
    [1x7   uint16]
    [1x0   uint16]
    [1x4   uint16]
    [1x0   uint16]
    [         280]
    []
    []
    [         293]
    [         295]
    [1x2   uint16]
    [         298]
    [1x0   uint16]
    [1x8   uint16]
    [1x5   uint16]
Run Code Online (Sandbox Code Playgroud)

请注意,某些条目保留[],如行#6,而其他[1x0]条目保存项目,如行#3.

  1. 它们之间有什么区别吗?(除了MATLAB以不同方式显示它们的事实).MATLAB在内存中如何表示它们的差异?
  2. 如果区别仅在于MATLAB内部如何表示它们,为什么程序员应该意识到这种差异呢?(即为什么以不同的方式显示它们?).它是一个(无害的)bug吗?或是否有任何好处在明知这样的阵列被表示不同?

matlab matrix

22
推荐指数
2
解决办法
1万
查看次数

实现复杂的基于旋转的摄像头

我正在实现用于空间可视化的3D引擎,并且正在编写具有以下导航功能的相机:

  • 旋转相机(即类似于旋转头部)
  • 旋转任意3D点(空间中的一个点,可能不在屏幕的中心;相机需要围绕此旋转,保持相同的相对观察方向,即外观方向也会改变.这不直接看选择的旋转点)
  • 平移在相机的平面中(因此在垂直于相机外观矢量的平面中向上/向下或向左/向右移动)

相机不应该滚动 - 也就是说,"向上"仍在继续.因此,我代表具有位置和两个角度的摄像机,围绕X和Y轴旋转(Z将滚动.)然后使用摄像机位置和这两个角度重新计算视图矩阵.这适用于平移和旋转眼睛,但不适用于围绕任意点旋转.相反,我得到以下行为:

  • 眼睛本身显然比它应该进一步向上或向下移动
  • m_dRotationX0或pi 时,眼睛根本不向上或向下移动.(万向节锁?我怎么能避免这种情况?)
  • 眼睛的旋转被反转(当它m_dRotationX在pi和2pi之间时,改变旋转使其在看起来应该向下看时向下看,当看起来应该向下看时向下看).

(a)导致这种"漂移"的原因是什么?

这可能是万向节锁定.如果是这样,标准答案是"用四元数来表示转动"说,这里的许多倍SO(1,2,3为例),但遗憾的是没有具体的细节(例如,这是最好的答案,我发现到目前为止;它很少见.)我一直在努力使用四元数结合上述两种类型的旋转来实现相机.事实上,我正在使用两个旋转来构建四元数,但是下面的评论者说没有理由 - 立即构建矩阵也没关系.

在围绕某个点旋转时更改X和Y旋转(表示摄像机外观方向)时会发生这种情况,但直接更改旋转时不会发生这种情况,即将摄像机绕自身旋转.对我来说,这没有意义.这是相同的价值观.

(b)这种相机会采用不同的方法(例如四元数)吗?如果是这样,我如何实现上述所有三个相机导航功能?

如果不同的方法会更好,那么请考虑提供该方法的具体实施示例.(我使用的是DirectX9和C++,以及SDK提供的D3DX*库.)在第二种情况下,我会在几天内添加并奖励一笔赏金,我可以在问题中添加一个.这可能听起来像我在蹦蹦跳跳,但我的时间很少,需要快速实施或解决这个问题(这是一个紧迫的截止日期的商业项目.)详细的答案也将改善SO档案,因为大多数到目前为止我读过的相机答案对代码很轻松.

谢谢你的帮助 :)


一些澄清

感谢您的评论和答案到目前为止!我将尝试澄清有关该问题的一些事项:

  • 每当其中一个变化时,从摄像机位置和两个角度重新计算视图矩阵.矩阵本身永远不会累积(即更新) - 它会重新重新计算.然而,相机位置和两个角度变量被累积(例如,每当鼠标移动时,基于鼠标上下移动的像素数量,一个或两个角度将增加或减少一小部分和/或或者在屏幕左右.)

  • 评论员JCooper声称我正遭受万向节锁定,我需要:

在变换上添加另一个旋转,在应用变换之前将eyePos旋转到完全在yz平面中,然后再旋转另一个旋转.在应用偏航 - 俯仰 - 滚动矩阵之前和之后立即围绕y轴旋转以下角度(其中一个角度需要被否定;尝试它是决定哪个角度的最快方法). double fixAngle = atan2(oEyeTranslated.z,oEyeTranslated.x);

不幸的是,当按照描述实现这一点时,由于其中一个旋转,我的眼睛以非常快的速度从场景上方射出.我确定我的代码只是这个描述的一个糟糕的实现,但我仍然需要更具体的东西.一般来说,我发现算法的非特定文本描述不如评论,解释的实现有用. 我正在为一个具体的工作示例添加一个赏金,它与下面的代码集成(也就是使用其他导航方法.)这是因为我想了解解决方案,并且有一些有用的东西,因为我因为我处于紧迫的截止日期,所以需要实施一些有效的方法.

如果你回答算法的文字描述,请确保它足够详细('旋转Y,然后变换,然后旋转'对你有意义,但缺乏细节知道你的意思. 好答案清晰,标示,即使有不同的基础,也会让其他人理解,是'坚固的防风雨信息板.')

反过来,我试图清楚地描述问题,如果我能说清楚,请告诉我.


我目前的代码

要实现上述三个导航功能,在基于光标移动的像素移动的鼠标移动事件中:

// Adjust this to change rotation speed when dragging (units are radians …
Run Code Online (Sandbox Code Playgroud)

c++ math directx matrix quaternions

22
推荐指数
2
解决办法
6774
查看次数

Matlab:如何随机混洗矩阵列

我有一个矩阵像:

 A=
    4 7 8 9
    3 3 5 7
    6 4 8 6
Run Code Online (Sandbox Code Playgroud)

并希望随机随机播放列,并执行以下操作:

 A=
    8 4 9 7
    5 3 7 3
    8 6 6 4
Run Code Online (Sandbox Code Playgroud)

有谁有想法吗?

arrays random matlab matrix

22
推荐指数
1
解决办法
2万
查看次数

如何在matlab中直接创建逻辑矩阵

我到目前为止一直在使用

 a = logical(zeros(10,10))
Run Code Online (Sandbox Code Playgroud)

创建逻辑矩阵.

有没有办法直接创建它?

matlab matrix

22
推荐指数
2
解决办法
2万
查看次数

解决线性方程组的最有效方法

我有一个(nxn)对称矩阵A和一个(nx 1)向量B.基本上,我只需要解决Ax = b for x.问题是A可能会很大.所以我正在寻找最有效的C++求解线性方程的算法.我查看了Eigen库.显然它有一个SVD方法,但我被告知它很慢.解决x =逆(A)*b似乎也不是最理想的.uBLAS更快吗?有没有更有效的方法?谢谢.

编辑:矩阵A是正定的而不是稀疏的.

c++ matrix linear-algebra eigen

22
推荐指数
1
解决办法
3万
查看次数