标签: linear-algebra

密集对称矩阵的特征有效型

Eigen是否具有存储密集,固定大小,对称矩阵的有效类型?(嘿,它们无处不在!)

即N = 9,它应该只存储(1 + 9)*9/2 == 45个元素并且它具有适当的操作.例如,应该有效地添加两个对称矩阵,其返回相似的对称矩阵.

如果没有这样的事情,那么哪些动作(看起来像这样)我应该把这种类型介绍给Eigen?它有"观点"的概念吗?我可以为自己的类型写一些类似"矩阵视图"的东西,这会让它成为特征性的吗?

PS可能我可以使用map将普通数组视为1xN矩阵,并对其进行操作.但这不是最干净的解决方案.

c++ matrix linear-algebra eigen

17
推荐指数
2
解决办法
8379
查看次数

矢量化梯度下降算法

我在matlab中编写梯度下降.对于两个功能,我得到了更新步骤:

temp0 = theta(1,1) - (alpha/m)*sum((X*theta-y).*X(:,1));
temp1 = theta(2,1) - (alpha/m)*sum((X*theta-y).*X(:,2));
theta(1,1) = temp0;
theta(2,1) = temp1;
Run Code Online (Sandbox Code Playgroud)

但是,我想要对此代码进行矢量化,并能够将其应用于任意数量的功能.对于矢量化部分,有人向我指出,我想要做的是矩阵乘法

theta = theta - (alpha/m) * (X' * (X*theta-y));
Run Code Online (Sandbox Code Playgroud)

这很好看,但是当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新.

然后,我如何矢量化此代码并确保参数并同时更新?

matlab machine-learning linear-algebra gradient-descent

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

为什么Matlab的inv缓慢且不准确?

我在几个地方(在文档和这篇博文中阅读:http://blogs.mathworks.com/loren/2007/05/16/purpose-of-inv/)中读到,在Matlab中使用inv不是建议因为它很慢而且不准确.

我试图找出这种不准确的原因.截至目前,谷歌没有给出有趣的结果,所以我认为有人可以指导我.

谢谢 !

matlab linear-algebra matrix-inverse numerical-analysis

16
推荐指数
2
解决办法
7356
查看次数

确定A + B = C是否存在于n个整数的数组中

这是我的一个朋友作为他的家庭作业(在算法和数据结构类中)收到的问题.他问我这件事.但是,我无法解决它,并且在过去的几天里一直在思考它.

Ñ范围随机整数[0,2 31 -1](有可能重复.确定是否3个数字,这些数字的满足 + = Ç.

我首先提出了一个O(n 2 log n)的天真算法.然后我想出了一个O(n 2)的算法.这是伪代码:

sort(a); // non-descending
for (i = 0; i < n; i++) {
  j = i; k = i + 1;
  while (j < n && k < n) {
    if (a[i] + a[j] == a[k])
      return true;
    else if (a[i] + a[k] < a[j])
      k++;
    else
      j++;
  }
}
return false;
Run Code Online (Sandbox Code Playgroud)

然而,问题表明1 < n <= 10 6.我相信O(n …

arrays algorithm integer linear-algebra

16
推荐指数
1
解决办法
5409
查看次数

numpy在多核硬件上

关于在numpy内部和外部矢量产品,矢量矩阵乘法等方面使用多核(在英特尔硬件上)的最新技术是什么?

numpy如果有必要,我很乐意重建,但此时我正在研究如何在不改变代码的情况下加快速度.

作为参考,我show_config()的如下,我从未观察numpy到使用多个核心:

atlas_threads_info:
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    language = f77
    include_dirs = ['/usr/local/atlas-3.9.16/include']

blas_opt_info:
    libraries = ['ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')]
    language = c
    include_dirs = ['/usr/local/atlas-3.9.16/include']

atlas_blas_threads_info:
    libraries = ['ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    language = c
    include_dirs = ['/usr/local/atlas-3.9.16/include']

lapack_opt_info:
    libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
    library_dirs = ['/usr/local/atlas-3.9.16/lib']
    define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')]
    language = f77
    include_dirs = ['/usr/local/atlas-3.9.16/include'] …
Run Code Online (Sandbox Code Playgroud)

python performance multicore numpy linear-algebra

16
推荐指数
1
解决办法
4620
查看次数

numpy任意精度线性代数

我有一个numpy 2d阵列[中/大型 - 比如500x500].我想找到它的元素指数的特征值.问题是某些值非常负(-800,-1000等),并且它们的指数下溢(意味着它们非常接近零,因此numpy将它们视为零).无论如何在numpy中使用任意精度?

我梦想的方式:

import numpy as np

np.set_precision('arbitrary') # <--- Missing part
a = np.array([[-800.21,-600.00],[-600.00,-1000.48]])
ex = np.exp(a)  ## Currently warns about underflow
eigvals, eigvecs = np.linalg.eig(ex)
Run Code Online (Sandbox Code Playgroud)

我已经搜索了一个gmpy和mpmath的解决方案无济于事.任何想法都会受到欢迎.

python math numpy linear-algebra arbitrary-precision

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

有没有办法计算将视图从帧A转换到帧B所需的CGAffineTransform?

说,我有两个CGRects,CGRect A和CGRect B.我的UIView的框架与CGRect B相同,但我想创建一个动画,显示UIView从框架A转换到B.

我试图通过改变UIView的transform属性来做到这一点,所以我不必太乱用它的框架.但是,我需要CGAffineTransform来实现这一目标.计算此变换的最佳方法是什么?

core-graphics linear-algebra ios

16
推荐指数
2
解决办法
6786
查看次数

行主要与列主要混淆

我一直在阅读很多关于这一点,我读的越多,我就越困惑.

我的理解:在行主要行连续存储在内存中,列主要列连续存储在内存中.因此,如果我们有一系列数字[1, ..., 9]并且我们想将它们存储在行主矩阵中,我们得到:

|1, 2, 3|
|4, 5, 6|
|7, 8, 9|
Run Code Online (Sandbox Code Playgroud)

而专栏(如果我错了,纠正我)是:

|1, 4, 7|
|2, 5, 8|
|3, 6, 9|
Run Code Online (Sandbox Code Playgroud)

这实际上是前一个矩阵的转置.

我的困惑:嗯,我没有看到任何区别.如果我们迭代两个矩阵(按第一个中的行和第二个中的列),我们将以相同的顺序覆盖相同的值:1, 2, 3, ..., 9

即使矩阵乘法是相同的,我们采用第一个连续元素并将它们与第二个矩阵列相乘.所以说我们有矩阵M:

|1, 0, 4| 
|5, 2, 7| 
|6, 0, 0|
Run Code Online (Sandbox Code Playgroud)

如果我们乘上一列,主要基质RM,那就是R x M我们会得到:

|1*1 + 2*0 + 3*4, 1*5 + 2*2 + 3*7, etc|
|etc.. |
|etc.. |
Run Code Online (Sandbox Code Playgroud)

如果我们乘列矩阵主要CM,那就是C x M采取的列C,而不是其行,我们得到完全来自相同的结果R …

c opengl matrix linear-algebra

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

为什么a*b*a在Matlab脚本中使用gpuArray时需要比('*'(a*b)')'更长的时间?

下面的代码执行操作上gpuArrays相同的操作ab在两种不同的方式.第一部分计算(a'*(a*b)')',第二部分计算a*b*a.然后验证结果是相同的.

%function test
clear
rng('default');rng(1);
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c1=gather(transpose(transpose(a)*transpose(a*b)));
disp(['time for (a''*(a*b)'')'': ' , num2str(toc),'s'])

clearvars -except c1

rng('default');
rng(1)
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c2=gather(a*b*a);
disp(['time for a*b*a: ' , num2str(toc),'s'])

disp(['error = ',num2str(max(max(abs(c1-c2))))])

%end
Run Code Online (Sandbox Code Playgroud)

但是,计算(a'*(a*b)')'速度大约是计算速度的4倍a*b*a.以下是R2018a上Nvidia K20上面脚本的输出(我尝试过不同的版本和不同的GPU,具有相似的行为).

>> test
time for (a'*(a*b)')': 0.43234s
time for a*b*a: 1.7175s
error = 2.0009e-11
Run Code Online (Sandbox Code Playgroud)

甚至更奇怪的是,如果上述脚本的第一行和最后一行是未注释的(它变成一个函数),则两个取较长的时间量(〜1.7S代替〜0.4秒).以下是此案例的输出:

>> test
time for (a'*(a*b)')': 1.717s
time for a*b*a: 1.7153s
error = 1.0914e-11
Run Code Online (Sandbox Code Playgroud)

我想知道是什么导致了这种行为,以及如何在matlab函数内而不是在脚本内部的较短时间内(即~0.4s而不是~1.7s)执行 …

matlab gpu matrix linear-algebra sparse-matrix

16
推荐指数
2
解决办法
277
查看次数

在PyTorch中data.norm()<1000做什么?

我在这里关注PyTorch教程.它说

x = torch.randn(3, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2

print(y)

Out:    
tensor([-590.4467,   97.6760,  921.0221])
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下data.norm()在这里做什么吗?当我改变.randn.ones它的输出 tensor([ 1024., 1024., 1024.]).

python linear-algebra deep-learning pytorch tensor

16
推荐指数
2
解决办法
4773
查看次数