我n-by-m-by-t在MATLAB中有一个3d矩阵()表示n-by-m一段时间内网格中的测量值.我想有一个二维矩阵,其中空间信息不见了,只有n*m随着时间的推移测量t留(即:n*m-by-t)
我怎样才能做到这一点?
在红宝石中,我想知道是否有办法做到以下几点:
我基本上有一个包含四种可能结果的矩阵:
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)
......但这不起作用.那么,处理这种情况的最佳方法是什么?
我不太明白为什么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)给出了更精确的结果.为什么是这样?
究竟发生了什么,使一个"比另一个更好"?
我正在尝试比较矩阵乘法的不同方法.第一个是常规方法:
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) 在一次采访中,我被问到是否给了一个n*m矩阵如何计算给定子矩阵中值的总和(由左上角,右下角坐标定义).
我被告知我可以预处理矩阵.
我被告知矩阵可能很大,子矩阵也是如此,因此算法必须高效.我偶然发现了一些并没有被告知最佳答案.
有谁有一个很好的答案?
我在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.
我正在实现用于空间可视化的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) 我有一个矩阵像:
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)
有谁有想法吗?
我有一个(nxn)对称矩阵A和一个(nx 1)向量B.基本上,我只需要解决Ax = b for x.问题是A可能会很大.所以我正在寻找最有效的C++求解线性方程的算法.我查看了Eigen库.显然它有一个SVD方法,但我被告知它很慢.解决x =逆(A)*b似乎也不是最理想的.uBLAS更快吗?有没有更有效的方法?谢谢.
编辑:矩阵A是正定的而不是稀疏的.