天道酬勤,学无止境

linear-algebra

How can i check if a number is present within another number if i am storing the number as an integer data type?

问题 我想检查整数中是否包含特定数字,即说我们有数字 134、340、3450,我们如何检查数字中是否包含 34 。 如果我们将数字存储为字符串,这种情况是微不足道的,但是当我们将它们存储为数组整数时是否可以这样做? 我最初的想法是我们可能必须使用 10 的倍数的模运算符! 回答1 char buffer[20] = ""; int n = 3450; snprintf( buffer, 20, "%d", n ); printf( "%s\n", strstr( buffer, "34" ) ? "present" : "not present" ); 回答2 这是一个纯粹的二进制解决方案(不转换为字符串)。 注意:仅限无符号值。 int main(int argc, char *argv[]) { std::vector<unsigned long> nums = { 3450, 1233, 3, 34, 3534, 10003400, 0 }; const unsigned long pattern = 34; unsigned long mod = 10; //power of 10 that will isolate the pattern number of digits while ((pattern % mod) != pattern) mod *= 10; /

2022-05-14 15:22:04    分类:技术分享    c++   c   arrays   algorithm   linear-algebra

Simulating matlab's mldivide with OpenCV

问题 我昨天问了这个问题:Simulating matlab's mrdivide with 2 square matrices 这就是 mrdivide 的工作。 但是现在我遇到了mldivide的问题,目前实现如下: cv::Mat mldivide(const cv::Mat& A, const cv::Mat& B ) { //return b * A.inv(); cv::Mat a; cv::Mat b; A.convertTo( a, CV_64FC1 ); B.convertTo( b, CV_64FC1 ); cv::Mat ret; cv::solve( a, b, ret, cv::DECOMP_NORMAL ); cv::Mat ret2; ret.convertTo( ret2, A.type() ); return ret2; } 据我了解,mrdivide 正在工作的事实应该意味着 mldivide 正在工作,但我无法让它给我与 matlab 相同的结果。 结果再次完全不同。 值得注意的是,我正在尝试做一个 [19x19] \ [19x200] 所以这次不是方阵。 回答1 就像我之前在您的另一个问题中提到的那样,我将 MATLAB 与 mexopencv 一起使用,这样我就可以轻松地比较 MATLAB 和 OpenCV 的输出。 也就是说

2022-05-12 02:10:43    分类:技术分享    c++   matlab   opencv   linear-algebra

Nonnegative Matrix Factorization: The Alternating Least Squares Method

问题 我正在尝试使用交替最小二乘法实现 NMF。 我只是对以下问题的基本实现感到好奇: 如果我理解正确,我们可以在没有非负约束的情况下求解此伪代码中所述的每个矩阵方程,使用封闭形式的解并将负条目设置为 0,以蛮力的方式。 这种理解正确吗? 这是更复杂、受约束的优化问题的基本替代方案,例如,我们使用投影梯度下降? 更重要的是,如果以这种基本方式实现,算法是否有实用价值? 我想使用 NMF 来减少变量,使用 NMF 很重要,因为我的数据根据​​定义是非负的。 我正在寻找对此的意见。 回答1 回答2 在这个算法中使用非负最小二乘法而不是剪掉负值在这个算法中显然会更好,但总的来说我不会推荐这种基本的 ALS/ANNLS 方法,因为它的收敛性很差(它经常波动甚至可以显示发散) - 一种更好的方法的最小 Matlab 实现,NMF 的加速分层交替最小二乘法(Cichocki 等人的),这是目前最快的方法之一,如下所示(Nicolas Gillis 的代码): % Accelerated hierarchical alternating least squares (HALS) algorithm of % Cichocki et al. % % See N. Gillis and F. Glineur, "Accelerated Multiplicative Updates and %

2022-05-12 01:17:12    分类:技术分享    matlab   matrix   linear-algebra   matrix-factorization

Multilayer Perceptron replaced with Single Layer Perceptron

问题 我在理解 MLP 和 SLP 之间的区别时遇到了问题。 我知道在第一种情况下,MLP 有多个层(隐藏层),并且神经元具有非线性激活函数,如逻辑函数(梯度下降所需)。 但我读过: “如果 MLP 中的所有神经元都具有线性激活函数,则 MLP 可以被单层感知器代替,它只能解决线性可分问题” 我不明白为什么在 XOR 的特定情况下,它不是线性可分的,等效的 MLP 是一个两层网络,每个神经元都有一个线性激活函数,如阶跃函数。 我知道我需要两行来分隔,但在这种情况下,我不能应用前一条语句的规则(用 SLP 替换 MLP)。 异或的 Mlp: http://s17.postimg.org/c7hwv0s8f/xor.png 在链接图像中,神经元 AB 和 C 具有线性激活函数(如阶跃函数) 异或:http://s17.postimg.org/n77pkd81b/xor1.png 回答1 线性函数是f(x) = ax + b 。 如果我们采用另一个线性函数g(z) = cz + d并应用 g(f(x)) (这相当于将一个线性层的输出作为下一个线性层的输入),我们得到g(f(x)) = c (ax + b) + d = ac x + cb + d = (ac) x + (cb + d)这本身就是另一个线性函数。 阶跃函数不是线性函数- 您不能将其写为ax + b 。

2022-05-11 08:33:08    分类:技术分享    math   machine-learning   neural-network   linear-algebra   perceptron

Eigen Library:: How do I create a block diagonal sparse matrix out of existing sparse matrices?

问题 我有一堆 (n*n) 大小的稀疏矩阵,称为 M1、M2...、Mj。 我想创建一个大块对角稀疏矩阵,如下所示: |M1 0 0 . . . | |0 M2 0 . . . | |. . . . . . | |. . . Mj-1 0| |0 0 0 ... Mj| 我尝试了以下方法: Eigen::SparseMatrix<double> MatBLK(j*n,j*n); MatBLK.reserve(Eigen::VectorXd::Constant(j*n,3); //I know that there are at most 3 nonzero elements per row MatBLK.topLeftCorner(n,n) = M1.topLeftCorner(n,n); MatBLK.block(n,n,n,n) = M2.topLeftCorner(n,n); . . MatBLK(bottomRightCorner(n,n)) = Mj.topLeftCorner(n,n); MatBLK.makeCompressed(); 这种方法不起作用。 较小矩阵中的值不会被复制到较大的块矩阵中。 功能: MatBLK.nonZeros() 返回 0。 我是这个图书馆的新手。 任何帮助将不胜感激。 回答1 不幸的是,由于生成的代码效率低下

2022-05-11 02:50:15    分类:技术分享    c++   matrix   linear-algebra   sparse-matrix   eigen

Power Method in MATLAB(Power Method in MATLAB)

问题 我想实现幂法来确定 MATLAB 中矩阵的主要特征值和特征向量。 这是我到目前为止写的: %function to implement power method to compute dominant %eigenvalue/eigenevctor function [m,y_final]=power_method(A,x); m=0; n=length(x); y_final=zeros(n,1); y_final=x; tol=1e-3; while(1) mold=m; y_final=A*y_final; m=max(y_final); y_final=y_final/m; if (m-mold)<tol break; end end end 使用上面的代码,这是一个数字示例: A=[1 1 -2;-1 2 1; 0 1 -1] A = 1 1 -2 -1 2 1 0 1 -1 >> x=[1 1 1]; >> x=x'; >> [m,y_final]=power_method(A,x); >> A*x ans = 0 2 0 在MATLAB中与上述矩阵的特征值和特征向量进行比较时,我做了: [V,D]=eig(A) V = 0.3015 -0.8018 0.7071 0.9045 -0.5345 0.0000 0.3015 -0.2673 0.7071 D = 2

2022-05-10 13:38:08    分类:技术分享    matlab   matrix   linear-algebra   numerical-methods   eigenvector

Sum elements along a line of numpy array

问题 我有一个很大的形状矩阵(977,699)。 我想沿着大约从矩阵中心开始的一条线计算元素的总和。 线的角度应在 0 到 180 度之间变化(相对于从矩阵中心经过的另一条线),步长为 20 度。 对于每个步骤,我都想要元素的总和,因此输出应该是一个 10 个元素的 numpy 数组。 我怎么能在 numpy 中做到这一点? 我想我已经找到了做我想做的事的方法,但我仍然需要帮助。 这里有一个例子: data = array([[ 0., 3., 0., 2., 0., 0., 0., 0., 0., 3.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 18., 15., 25., 0., 0., 0.], [ 0., 0., 0., 23., 19., 20., 20., 0., 0., 0.], [ 0., 0., 20., 22., 26., 23., 18., 0., 0., 0.], [ 0., 0., 0., 23., 16., 20., 13., 0., 0., 0.], [ 0., 0., 0., 0., 18., 20., 18., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 4., 0., 0., 3

2022-05-08 14:50:16    分类:技术分享    python   arrays   numpy   linear-algebra

Generating random vector that's linearly independent of a set of vectors

问题 回答1 步骤 1. 生成随机向量vr 。 步骤 2. 将vr复制到vo并按如下方式更新:对于v1, v2... vn中每个已经生成的向量v ,减去vo在vi​​ 上的投影。 结果是一个与v1, v2... vn跨越的子空间正交的随机向量。 如果那个子空间是一个基础,那么它当然是零向量:) 可以根据 vr 的范数与 vo 的范数的比较来判断初始向量是否线性无关。 非线性独立向量的 vo-norm 为零或接近于零(一些数值精度问题可能使其成为大约几倍 epsilon 的小非零数,这可以通过依赖于应用程序的方式进行调整)。 伪代码: vr = random_vector() vo = vr for v in (v1, v2, ... vn): vo = vo - dot( vr, v ) / norm( v ) if norm(vo) < k1 * norm(vr): # this vector was mostly contained in the spanned subspace else: # linearly independent, go ahead and use 这里 k1 是一个很小的数字,可能是 1e-8 到 1e-10? 您还可以通过 vr 和子空间之间的角度:在这种情况下,将其计算为theta = arcsin(norm(vo) / norm(vr)) 。

2022-05-07 11:11:10    分类:技术分享    c   linear-algebra   vector-graphics

Shear Matrix as a combination of basic transformation?

问题 我知道旋转、缩放、平移等的变换矩阵。我也知道剪切变换的矩阵。 现在,我需要剪切矩阵—— [1 Sx 0] [0 1 0] [0 0 1] 以 其他 上述 变换 组合 的 形式. 尝试搜索,尝试头脑风暴,但无法罢工! 谢谢! 回答1 剪切角theta的 x 剪切操作减少为旋转和缩放,如下所示: (a) 逆时针旋转theta/2 。 (b) 使用x-scaling factor = sin(theta/2)和y-scaling factor = cos(theta/2) 。 (c) 顺时针旋转45 degree 。 (d) 使用x-scaling factor = sqrt(2)/sin(theta)和y-scaling factor= sqrt(2) 。 回答2 是的,它可以完成,旋转之后是非均匀缩放和反向旋转。 您可以在第三个问题 http://www.cs.cmu.edu/~djames/15-462/Fall03/assts/15-462-Fall03-wrAssign1-answer.pdf 中找到详细信息。 您也可以尝试以下 openGL 代码。 它将矩形旋转 45 度,然后在 x 轴上缩放。 然后旋转 -26 度,即 atan(0.5)。 0.5 来自在 x 方向缩放后找到 x 轴和一侧之间的角度。 glRotatef(-26.0, 0.0, 0.0, 1.0)

2022-05-06 08:40:24    分类:技术分享    matrix   graphics   linear-algebra   transformation   rotational-matrices

Numpy - Dot Product of a Vector of Matrices with a Vector of Scalars

问题 我有一个 3 维数据集,我试图通过以下方式操作。 data.shape = (643, 2890, 10) vector.shape = (643,) 我希望 numpy 将数据视为 2890x10 矩阵的 643 长度一维数组,并计算数据和向量之间的点积(和积?)。 我可以通过循环来做到这一点,但真的很想找到一种使用原语来做到这一点的方法(这将在并行节点上运行多次)。 等效循环(我相信): a = numpy.zeros ((2890, 10)) for i in range (643): a += vector[i]*data[i] 非常感谢! 对不起,如果这是一个转发,我已经搜索了很多地方,最后创建了一个帐户来问你们。 a = numpy.array ([[[1,1,1,1],[2,2,2,2],[3,3,3,3]], [[3,3,3,3],[4,4,4,4],[5,5,5,5]]]) b = numpy.array ([10,20]) # Thus, a.shape = (2,3,4) b.shape = (2,) # Want an operation . such that: a . b = [[10,10,10,10],[20,20,20,20],[30,30,30,30]] + [[60,60,60,60],[80,80,80,80],[100,100,100

2022-05-05 20:19:13    分类:技术分享    python   numpy   linear-algebra