如何将一个二维向量 "四舍五入 "到最接近的15度
我正在制作一个简单的游戏,我正在尝试简化游戏中2D碰撞反应的一部分.当某些物体撞到墙壁时,我正在计算碰撞正常(collisionPoint - objectCenter),并根据正常情况进行反射.我有兴趣将正常矢量四舍五入到最接近的15°°,但我不确定这是一个很好的方法. 我目前的想法正在做类似的事情 float angle = atan2(normal.Y, normal.X) * Rad2Deg; float newAngle = ((int)(angle + 7.5f) / 15) * 15.0f * Deg2Rad; vector2 newNormal = vector2(cos(newAngle), sin(newAngle)); 这是做到这一点的合理方法吗?有更好的方法吗? 解决方案 尝试以下方法: float roundAngle = 15 * Deg2Rad; float angle = (float)Math.Atan2(normal.Y,
12 2024-04-23
编程技术问答社区
C#线性代数库
是否有稳定的线性代数(更具体地说,是c#的库,矩阵,多维数组和基本操作)? 搜索产生了一些开源库,这些库要么几年没有更新,要么处于早期beta阶段 - 和中心空间.哪些替代方案值得检查? 解决方案 math.net .我们正在生产中使用它. 其他解决方案 请参阅: http://www.alglib.net/开放源.多语言库. http://www.mathdotnet.com/开放源.正如别人提到的. DnAnalytics由 http://numerics.mathdotnet.com/ http://www.lutzroeder.com/dotnet/ - lutz roeder拉帕克的端口mapack.net. http://www.extremeoptimization.com/ - 商业. 其他解决方案 我正在使用ilnumerics.net www.ilnumerics.net 非常好的支持和稳定.我没有任何比较.
38 2024-04-11
编程技术问答社区
2条线相交的算法?
我有2行.两条线包含2点的x和y.这意味着它们都有长度. i看到了2个公式,一种使用决定因素,一种使用正常代数.哪个是最有效的计算效率,公式是什么样的? 我很难使用代码中的矩阵. 这是我到目前为止的目标,可以更有效吗? public static Vector3 Intersect(Vector3 line1V1, Vector3 line1V2, Vector3 line2V1, Vector3 line2V2) { //Line1 float A1 = line1V2.Y - line1V1.Y; float B1 = line1V1.X - line1V2.X; float C1 = A1*line1V1.X + B1*line1V1.Y; //Line2 float A2 = line2V2.Y - line2V1.Y; float B2 = line2V1.X - line2V2.X; f
12 2024-04-11
编程技术问答社区
渐进式下流程序的表述
我正在阅读有关渐进的下流概念及其在音乐行业中的重要性音乐中的逐渐溢出应用 我很好地了解了溢流缓冲区的问题,但是我不知道如何表示底流. 您能给我一个示例(最好是在C或C ++中的程序),就像计算机如何处理渐进的下流吗? 解决方案 逐渐的下流与IEEE 754所说的"亚正常"数字有关. 考虑使用科学符号(例如)10位精度和指数的数字,范围从-99到99. 在正常情况下,您将所有内容都视为科学符号,因此,如果您想代表1000,则表示为1e3-也就是说,1 * 10 3 . 现在,考虑一个像1.234e-102之类的数字.您可以代表的最小指数是-99.因此,如果您以最简单的方式完成工作,那么您简单地说,因为它的指数小于它,它只是0. 在IEEE 754(及相关标准)中,您可以将其存储为(本质上)0.001234 * 10 -99 .这样,与在-99 ... 99范围内具有指数的正常数字相比,您可能会失去一些精度.另一方面,您的 少了,而与刚将其舍入为零,因
4 2024-04-10
编程技术问答社区
在程序中求解两个线性方程
我有两行UV和PQ,带有U(15,10)V(50,25)和P(40,10)和Q(30,30). 我发现这两个点之间的相交点. 我正在为此形成两个线性方程: eq 1: Ux + t(Vx-Ux) = Px +s(Qx-Px) eq2 我想使用C程序求解这些方程,以获取t或s. 的值 我从第二个方程式使用了t,然后将其替换为第一个方程式以获取一个公式来查找s.但是它没有解决.如何在程序中解决这个问题? 解决方案 使用此方程 2行的交叉点.您可以使用长期扩展的形式,也可以抽象计算2x2依据的函数.请注意使用整数,您可能会溢出. 其他解决方案 int s,sa,sb; 好吧,sa是一个整数. sa=1/((Vx-Ux)*(Qy-Py)-(Qx-Px)*(Vy-Uy)); 由于这些都是整数,因此您正在使用整数数学进行整数的倒数.结果是无限的,如果整数为零,一个如果是一个,则为负数,如果是负数为负,则为负数,如果是其他,则为零.因此,s
10 2024-04-09
编程技术问答社区
生成与一组向量线性独立的随机向量'的随机向量
我正在尝试提出一种算法,该算法将使我能够生成一个随机的n维实价矢量,该向量相对于一组已经生成的向量是线性独立的. i 不想强迫它们是正交的,只有线性独立.我知道Graham-Schmidt存在正交问题,但是是否有较弱的形式只能为您提供线性独立的向量? 解决方案 步骤1.生成随机向量vr. 步骤2.复制vr到vo并进行以下更新:对于v1, v2... vn中的每个已经生成的vector v,减去vo on vi的投影. 结果是v1, v2... vn跨越子空间的随机向量正交.如果该子空间是一个基础,那么它是零向量,当然:) 可以根据VR规范与VO的规范的比较来做出初始矢量是否线性独立的决定.非线性独立的向量将具有零或接近零的vo-norm(某些数值精度问题可能使其在几次epsilon的顺序上成为一个小的非零数字,这可以以应用程序依赖性方式调整). 伪代码: vr = random_vector() vo = vr for v in (v1, v2, .
22 2024-04-07
编程技术问答社区
将邻接矩阵转换为距离或跳跃矩阵
是否可以将 邻接矩阵 和零为定义此处定义为/dandy_matrix#示例_and_uses" rel =" nofollow noreferrer">在这里每个链接的位置为单位长度1? 解决方案 一个和零的邻接矩阵只是无向图的表示.要获得未加权图的任何两个顶点之间的距离,您可以使用假设您有一个n n矩阵: for each vertex i: initialize an nxn matrix M run breadth-first search starting at i copy distances into row i of M return M
20 2024-04-07
编程技术问答社区
适用于C语言(非C++)的有限域(伽罗瓦域)线性代数库
我正在寻找有限字段/galois field/galois field c的精确线性代数库(C ++是不可接受的,因为我需要能够为其写一个haskell束缚,这显然是我找到了特别是我希望能够繁殖𝔽 p n×1 和𝔽 p 1×M 矩阵(向量)至𝔽 p n×m 矩阵. 那么,有人知道合适的C或" Extern C"库? ps:这是我的 haskell问题关于同一问题. 解决方案 pari/gp opensource是用c写的,它支持一些有限字段的基本线性代数. 当然,对我的特定适合性没有保证 - 我与发展无关.
10 2024-04-07
编程技术问答社区
使用矩阵、欧拉角和或四元数来表示旋转的利弊是什么?
矩阵和欧拉角可能会遭受t型锁的障碍,但是其他一些论点是另一个使用? 您认为DirectX的最爱是什么? 您在每日C ++/C/DirectX编程中使用什么? 解决方案 欧拉角仅需要三个参数,而不是存储矩阵(或三个,但听起来过多).但是,当您应用Euler旋转时,您可能最终会得到相当于三个矩阵乘法的东西来创建转换.如果您仅使用矩阵,则可能不会产生如此昂贵的成本(取决于矩阵的构造方式).除了振荡锁外,当您需要谨慎的旋转矩阵表示插值时,取消效果也存在问题. 您可能需要考虑四个四元.它们需要四个存储参数,因此它们不是很重.它们避免了阳性锁,可以插值以呈现平滑的旋转.可以解释为四个问题的缺点的一件事是,对于某些人来说,它们可能不是很直观.矩阵变换和Euler角具有一种非常直观的滚动式透明或旋转式纽扣.四元组更类似于在某些最终轴上伸出的单一旋转. 在某些情况下,某人比另一种方法更喜欢一种方法,所以这些只是在做出决定时要考虑的事情. 其他解决方案 欧拉角具有奇异
10 2024-04-07
编程技术问答社区
C语言中克朗克产品的高效计算
我对C的新手是新手,在我的大多数研究中,任何事情都比Python更快.但是,事实证明,我最近从事的工作需要计算相当大的向量/矩阵,因此可能有C+MPI解决方案. 数学上讲,任务非常简单.我有很多维度的向量〜40K,并希望计算 kronecker产品这些向量,然后总和这些Kronecker产品. 问题是,如何有效地做到这一点?以下代码结构,使用循环或获得效果有什么问题? 下面描述的函数kron通过长度vector_size的向量A和B,并计算其Kronecker产品,并将其存储在C中,A vector_size*vector_size矩阵中. . void kron(int *A, int *B, int *C, int vector_size) { int i,j; for(i = 0; i
6 2024-04-07
编程技术问答社区
用于线性代数的C语言库
请给我一些有关线性代数的高性能C库(矩阵代数,特征值,特征向量等)的提示.可以是开源或封闭的. 解决方案 clapack(lapack的f2c'ed版本) 编辑多亏了OSGX的评论: clapack是引擎盖使用非常高性能的blas库的库,其他库,例如Atlas. GSL是一个独立的C库,不如基于Blas的任何快速.但是,其性能仍然相当不错(虽然不是极其不错),并且经常使用.主要是因为其可移植性. 我知道拉帕克和GSL都可以推荐这两个.拉帕克(Lapack)是非常低级的库,GSL可能更舒适,但是说到良好的性能 - 基于Blas的图书馆是. 其他解决方案 atlas ,也许? 编辑:如果您向C ++开放,则绝对应该检查 eigen ,这是一个非常整洁的库,也很快,根据基准测试. 其他解决方案 再次,如果您实际上正在寻找/打开现代C ++代码, armadillo /受欢迎的. 另请参阅自己的基准测试对 it ++ 和 newmat .
8 2024-04-07
编程技术问答社区
行为主与列为主的混淆
我已经阅读了很多有关此的信息,我读的越多. 我的理解:在行中,行中的行连续存储在存储器中,列中列中的列连续存储在内存中.因此,如果我们有一系列数字[1, ..., 9],并且我们想将它们存储在行矩阵中,我们会得到: |1, 2, 3| |4, 5, 6| |7, 8, 9| 列列(如果我错了,请纠正我)是: |1, 4, 7| |2, 5, 8| |3, 6, 9| 实际上是先前矩阵的转置. 我的困惑:嗯,我看不到任何区别.如果我们在两个矩阵上迭代(第一个矩阵中的行,以及第二个列中的行),我们将以相同顺序覆盖相同的值:1, 2, 3, ..., 9 甚至矩阵乘法是相同的,我们将第一个连续元素与第二个矩阵列相乘.因此,说我们有矩阵M: |1, 0, 4| |5, 2, 7| |6, 0, 0| 如果我们将上一个行矩阵R乘以M,那就是R x M我们将得到: |1*1 + 2*0 + 3*4, 1*5 + 2*2 + 3*7, etc|
34 2024-04-07
编程技术问答社区
C++内存高效解决Ax=b线性代数系统的问题
我正在使用数字库绑定用于Boost UBLAS来求解简单的线性系统. 以下工作正常,除了它仅限于处理矩阵A(m x m)以进行相对 小'​​M'. 实际上,我有一个更大的矩阵,尺寸为M = 10^6(最多10^7). 是否存在有效使用内存的AX = B的现有C ++方法. #include #include #include #include #include // compileable with this command //g++ -I/home/foolb/.boost/
12 2024-04-02
编程技术问答社区
Boost'y=Ax的线性代数解决方案
Boost有一个吗? 其中a,y和x分别是矩阵(稀疏,可能很大)和向量. y或x可能是未知的. 我似乎在这里找不到它: /libs/1_39_0/libs/numeric/ublas/doc/index.htm 解决方案 线性求解器通常是Lapack库的一部分,该库是BLAS库的更高级别的扩展.如果您在Linux上,Intel MKL具有一些良好的求解器,可用于密集和稀疏矩阵.如果您在Windows上,MKL可以免费进行一个月的试用...老实说,我没有尝试过其他任何一个.我知道Atlas软件包具有免费的Lapack实现,但不确定在Windows上运行有多难. 无论如何,请四处搜索在您的系统上工作的Lapack库. 其他解决方案 是的,您可以使用Boost的UBLAS库求解线性方程.这是使用lu-farcorize和back-substituting取得逆的一种短途方法: using namespace boost::ublas; Ainv = iden
24 2024-04-02
编程技术问答社区
将贝塞尔曲线分成两个相等的两半
我的曲线在2分之间.我想将所有曲线切成两个相等的一半. 我的想法之一是,如果我可以控制" t"值,我将以t = [0,0.5]和t = [0.5,1]绘制2个曲线,但我不知道如何.以下是我的代码.我不介意任何其他想法或建议 D3 test
12 2024-03-30
编程技术问答社区
求解pytorch中的sylvester方程
我正在尝试求解表单的sylvester矩阵方程 ax + xb = c 根据我所看到的,这些方程通常通过Bartels-Stewart算法进行连续的Schur分解来解决.我知道scipy.linalg已经具有solve_sylvester函数,但是我将Sylvester方程的解决方案集成到神经网络中,因此我需要一种计算梯度以使A,B和C可学习的方法.当前,我只是使用Kronecker产品和矢量化技巧来求解使用torch.linalg.solve的线性系统,但这具有可怕的运行时复杂性.我还没有找到对Sylvester方程的支持,更不用说Schur分解了,但是在我尝试在GPU上实现易货 - 史图尔特之前,是否有一种更简单的方法可以找到梯度? 解决方案 最初,我写了一个解决方案,该解决方案将基于import torch def sylvester(A, B, C, X=None): m = B.shape[-1]; n = A.shape[-1]; R, U = torch
22 2024-03-27
编程技术问答社区
横向模式下的增强现实应用
我正在尝试使用Coremotion框架构建一个增强现实应用程序.我试图摆脱苹果的公园样本代码项目,但它仅在肖像模式下起作用.我需要它在景观中工作.当切换到景观模式时,覆盖视图中的子视图以相反的方向移动,并且以错误的速度移动(它们移动太快或在屏幕上移动太慢) 我已经阅读了其他帖子 : 如Coremotion Tea Pot中所建议的例子所建议的. 旋转态度90度的四分法表示 我不认为第一个会起作用,因为我的增强现实应用程序要求它参考true north. 我也不了解第二次进行的数学. 关于如何完成这个复杂问题的任何建议. 解决方案 您现在在增强现实应用程序中有多远?我认为,从苹果公司看公园开始很苛刻.您需要有一些先进的数学理解.但是,如果这样做,为什么不! 您可以查看此 reposority 肖像和景观模式.这是处理旋转的方式: - (void)deviceOrientationDidChange:(NSNotification *)
14 2024-03-19
编程技术问答社区
如何应用二进制掩码和STFT来产生一个音频文件?
因此,这是一个想法:您可以使用短期傅立叶变换(STFT)从音频文件生成频谱图.然后,有些人生成了一种称为"二进制掩码"的东西,以从反向stft产生不同的音频(即消除了背景噪声等). 这是我了解的: STFT是一个简单的方程式,应用于音频文件,该方程生成了可以轻松显示频谱图的信息. 通过将STFT矩阵的倒数取用,并将其乘以相同大小(二进制矩阵)的矩阵,您可以创建一个带有信息的新矩阵,以生成带有蒙版声音的音频文件. 我进行矩阵乘法后,如何创建新的音频文件? 这不是什么,但这是我在代码方面得到的: from librosa import load from librosa.core import stft, istft y, sample_rate = load('1.wav') spectrum = stft(y) back_y = istft(spectrum) 谢谢您,这里有一些幻灯片使我这么远.如果您可以在Python中给我一个例子/演示,我会很感激
16 2024-03-19
编程技术问答社区
神经网络的激活函数选择
我们可以在神经网络的隐藏层和输出层中使用不同的激活功能吗? 使用这种方案是否有明确的优势? 解决方案 简而言之 - 是的,您可以.这是一种使用Sigmoid函数作为隐藏层激活以确保非线性特征的常见方法,并且在为特定任务中选择的输出中激活(取决于您试图建模的内容以及您使用的成本函数). 其他解决方案 对于网络的最后一层,激活单元还取决于任务. 分类:您只希望您的一个输出之一成为标签之一,但是没有可靠的方法可以准确地实现这一目标,因此您需要使用 softmax 近似它. 回归:您将需要使用 sigmoid 或 tanh 激活,因为您希望结果是线性的.通过使用Sigmoid和Tanh,输出将在0到1之间缩放.因此,将易于优化. 对于中间层,现在几天 relu 被大多数人使用,因为它可以更快地计算,并且在背突出中不会消失. 其他解决方案 如果要实现预测任务而不是分类,则可以在输出层中使用线性组合,因为Sigmoid函数将输出范围限制为(0,1),通常以阈值分
如何测试Python中的矩阵是否只有1's和0's?
假设我有这样的矩阵: mat1 = np.array([1,0,1], [1,1,0], [0,0,0]); 我还有一个这样的人: mat2 = np.array([0,1,0], [0,0,1], [1,1,1]); 我想检测 之类的东西 np.add(mat1, mat2); 只有1个或0,即1个,一个0,全部0或全部1. n.b. - 评论您的代码. 解决方案 怎么样: >>> def check(matrix): ... # flatten up the matrix into one single list ... # and set on the list it should be [0,1] if it ... # contains only 0 and 1. Then do sum on that will ... # return 1 ... if sum(set(sum(matr
12 2024-03-07
编程技术问答社区