我使用%e
格式说明符.试过%3.2e
或%4.3e
.
示例:
if var=0.001342
,然后我要打印0.1342e-02
.但打印1.342e-03
如果var=0.543124
,然后我想打印54.3124e-02
.但打印 5.43124e-01
如果var=0.0123653
,然后我想打印1.23653e-02
.
这就是价值,我只是想修改我的指数值打印结果.
我的问题的简短版本:
A
如果我们已经知道属于特征向量的特征值,那么计算矩阵的特征向量的最佳方法是什么?
更长的解释:
我有一个大的随机矩阵A
,因为它是随机的,有一个非负的左特征向量x
(这样A^Tx=x
).
我正在寻找快速有效的数值计算这个向量的方法.(最好是在MATLAB或numpy/scipy中 - 因为这两者都包含在ARPACK/LAPACK中,任何一个都没问题).
我知道这1
是最大的特征值A
,所以我知道调用类似这样的Python代码:
from scipy.sparse.linalg import eigs
vals, vecs = eigs(A, k=1)
Run Code Online (Sandbox Code Playgroud)
将导致vals = 1
并vecs
等于我需要的向量.
然而,困扰我的是,计算特征值通常比解决线性系统更困难,并且通常,如果矩阵M
具有特征值l
,那么找到适当的特征向量就是求解方程的问题.(M - 1 * I) * x = 0
至少在理论上,这是一种比计算特征值更简单的操作,因为我们只求解线性系统,更具体地说,找到矩阵的零空间.
但是,我发现所有的零空间计算方法都MATLAB
依赖于svd
计算,这是我无法在我的大小矩阵上执行的过程.我也不能在线性方程上调用求解器,因为它们都只找到一个解决方案,而那个解决方案是0
(这是一个解决方案,但不是我需要的解决方案).
有没有办法避免调用eigs
类似函数来比通过计算最大特征值和伴随的特征向量更快地解决我的问题?
对于由'0'和'1'组成的矩阵A的每一列,我想找到第一次出现'1'的列索引(如果存在).例如,如果A定义为:
A=[0 0 0 0;
0 0 0 1;
0 0 0 0;
0 0 0 1;
1 0 0 0;
0 1 0 1;
1 1 0 0]
Run Code Online (Sandbox Code Playgroud)
那么结果将是:
b=[5 6 2]
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个没有'for'或'while'循环的解决方案.
我想出了一个解决方案:
[b,~]=find(cumsum(cumsum(A))==1)
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来做到这一点?
如果我在OS X上运行以下命令:
int main (void)
{
int* n; // initialise(declare) pointer
*n = 20; // the value in address pointed to by n is 20
printf("n: %i, n&: %i\n", n, &n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
n:1592302 512,n&:1592302 480
为什么不同的价值观?