矩阵

3D数学 ---- 矩阵的更多知识(2)

坚强是说给别人听的谎言 提交于 2020-03-07 14:36:04
矩阵的逆 另外一种重要的矩阵运算是矩阵的求逆,这个运算只能用于方阵。 运算法则 方阵 M 的逆,记作 M-1 ,也是一个矩阵。当 M 与 M-1 相乘时,结果是单位矩阵。表示为公式9.6的形式: 并非所有的矩阵都有逆。一个明显的例子是若矩阵的某一行或列上的元素都为0,用任何矩阵乘以该矩阵,结果都是一个零矩阵。如果一个矩阵有逆矩阵,那么称它为可逆的或非奇异的。如果一个矩阵没有逆矩阵,则称它为不可逆的或奇异矩阵。奇异矩阵的行列式为0,非奇异矩阵的行列式不为0,所以检测行列式的值是判断矩阵是否可逆的有效方法。此外,对于任意可逆矩阵 M ,当且仅当 v = 0 时, vM = 0 。 M 的”标准伴随矩阵“记作”adj M “,定义为M的代数余子式矩阵的转置矩阵。下面是一个例子,考虑前面给出的3x3阶矩阵 M : 计算 M 的代数余子式矩阵: M 的标准伴随矩阵是代数余子式矩阵的转置: 一旦有了标准伴随矩阵,通过除以 M 的行列式,就能计算矩阵的逆。 其表示如公式9.7所示: 例如为了求得上面矩阵的逆,有: 当然还有其他方法可以用来计算矩阵的逆,比如高斯消元法。很多线性代数书都断定该方法更适合在计算机上实现,因为它所使用的代数运算较少,这种说法其实是不正确的。对于大矩阵或某些特殊矩阵来说,这也许是对的。然而,对于低阶矩阵,比如几何应用中常见的那些低阶矩阵,标准伴随矩阵可能更快一些

Apache Spark源码走读之14 -- Graphx实现剖析

风流意气都作罢 提交于 2020-03-07 12:04:03
欢迎转载,转载请注明出处,徽沪一郎。 概要 图的并行化处理一直是一个非常热门的话题,这里头的重点有两个,一是如何将图的算法并行化,二是找到一个合适的并行化处理框架。Spark作为一个非常优秀的并行处理框架,将一些并行化的算法移到其上面就成了一个很自然的事情。 Graphx是一些图的常用算法在Spark上的并行化实现,同时提供了丰富的API接口。本文就Graphx的代码架构及pagerank在graphx中的具体实现做一个初步的学习。 Google为什么赢得了搜索引擎大战 当Google还在起步的时候,在搜索引擎领域,Yahoo正如日中天,红的发紫。显然,在Google面前的是一堵让人几乎没有任何希望的墙。 但世事难料,现在“外事问谷歌”成了不争的事实,Yahoo应也陪客了。 这种转换到底是如何形成的了,有一个因素是这样的,那就是Google发明了显著提高搜索准确率的PageRank算法。如果说PageRank算法的提出让谷歌牢牢站稳了搜索引擎大战的脚跟,这是毫不夸张的。 搜索引擎有几个要考虑的关键因素(个人观点而已)。 要想吸引用户,就必须要有出色的搜索准确率 有了用户,才能做广告投放,提高广告投放的针对性就可以盈利 上述两个方面都有非常优秀的算法。 废话少述,回到正题。PageRank算法是图论的一个具体应用,ok, 转到图论。 图论简介 图的组成

二维数组中的查找

不想你离开。 提交于 2020-03-07 09:26:36
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 C++11(clang++ 3.9) class Solution { public: bool Find(int target, vector<vector<int> > array) { // 1 3 4 5 // 2 5 8 9 // 5 6 11 13 // 8 9 12 15 // test case: target = 11 int row_count = array.size(); if(row_count <= 0) return false; int col_count = array[0].size(); if(col_count <= 0) return false; int row = 0; int col = col_count - 1; while(row < row_count && col >= 0) { if(array[row][col] == target) return true; else if(array[row][col] < target) row++; else col--; } return false; } }; 来源:

C语言 memcpy二维数组的复制

六月ゝ 毕业季﹏ 提交于 2020-03-07 09:10:25
int main(void) { int src[][3]={{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6},{7,8,9}}; int des[6][3]={0,0};//要小心,行数固定 printf("%d",sizeof(src)); print(src,6,3); memcpy(des,src,sizeof(src)); print(des,6,3); return 1; } https://www.cnblogs.com/shuqingstudy/p/4733307.html 来源: CSDN 作者: enjoyfate 链接: https://blog.csdn.net/u014683488/article/details/104708917

Eigen子矩阵操作

冷暖自知 提交于 2020-03-07 07:06:33
1 子矩阵操作简介 子矩阵操作又称块操作,在矩阵运算中,子矩阵的提取和操作应用也十分广泛。因此Eigen中也提供了相关操作的方法。提取的子矩阵在操作过程中既可以用作左值也可以用作右值。 2 块操作的一般使用方法 在Eigen中最基本的快操作运算是用 .block() 完成的。提取的子矩阵同样分为动态大小和固定大小。 块操作 构建动态大小子矩阵 提取块大小为(p,q),起始于(i,j) matrix.block(i,j,p,q) 同样需要注意的是在Eigen中,索引是从0开始。所有的操作方法都可以适用于Array.同样使用固定大小的操作方式在小型矩阵运算时更加的快,但要求在编译时就要知道矩阵的大小。 下面是一个使用示例: #include <iostream> #include "Eigen/Dense" using namespace std; using namespace Eigen; int main() { MatrixXf m(4,4); m<< 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16; cout<<"Block in the middle"<<endl; cout<<m.block<2,2>(1,1)<<endl<<endl; for(int i = 1;i <= 3;++i) { cout<<"Block of size "

Eigen矩阵基本运算

血红的双手。 提交于 2020-03-07 07:06:00
1 矩阵基本运算简介 Eigen重载了+,-,*运算符。同时提供了一些方法如dot(),cross()等。对于矩阵类的运算符重载只支持线性运算,比如matrix1*matrix2是矩阵相乘,当然必须要满足矩阵乘法规则。对于向量和标量的加法(vector+scalar)这里并不支持,关于非线性运算这里暂不介绍。 2 加减运算 矩阵加减运算中必须要保证左右矩阵的行列对应相等。此外更重要的一点是,矩阵的类型也必须一致,这里的矩阵运算 并不支持隐式的类型转换 。矩阵运算中重载的运算符有: 二元运算符+:a+b 二元运算符-:a-b 一元运算符-:-a 复合运算符+=:a+=b 复合运算符-=:a-=b 下面是使用示例: #include <iostream> #include "Eigen\Dense" using namespace Eigen; int main() { Matrix2d a; a<<1,2, 3,4; MatrixXd b(2,2); b<<2,3, 1,4; std::cout<<"a+b=\n"<<a+b<<std::endl; std::cout<<"a-b=\n"<<a-b<<std::endl; std::cout<<"Doing a+=b;"<<std::endl; a+=b; std::cout<<"Now a=\n"<<a<<std::endl;

判断上三角矩阵

…衆ロ難τιáo~ 提交于 2020-03-07 04:52:34
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。 本题要求编写程序,判断一个给定的方阵是否上三角矩阵。 输入格式: 输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。 输出格式: 每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。 输入样例: 2 3 1 2 3 0 4 5 0 0 6 2 1 0 - 8 2 输出样例: YES NO 代码: # include <stdio.h> int main ( ) { int t , n , flag = 0 ; int a [ 10 ] [ 10 ] ; int b [ 100 ] ; //判断是否为上三角矩阵 scanf ( "%d" , & t ) ; for ( int i = 0 ; i < t ; i ++ ) { scanf ( "%d" , & n ) ; for ( int i = 0 ; i < n ; i ++ ) //读入矩阵 { for ( int j = 0 ; j < n ; j ++ ) { scanf ( "%d" , & a [ i ] [ j ] ) ; } } for ( int i = 1 ; i < n ;

剑指Offer:二维数组中的查找(两种解法)

自闭症网瘾萝莉.ら 提交于 2020-03-07 00:02:34
剑指Offer:二维数组中的查找(两种解法) 问题描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: vector<vector > 【1, 2, 8, 9 】 【2, 4, 9, 12】 【4, 7, 10,13】 【6, 11, 15,16】 2. 解题思路 解法1 :利用二分查找以及该二维数组的特性 在示例中查询 6 ,执行的原理为: ①:先在第一行执行二分查找, ②:得到所需要查询的数介于vector[0][1]、vector[0][2]之间 ③:接着查询第二行,但是第二行不做全部二分查找,由于所查询的数比vector[0][2], 所以所查询的数在vector[1][0]和vector[1][2]之间,以此减少运算,以下以此类推 解法2 :利用该二维数组的特性 在示例中查询6,执行的步骤原理为: ①:首先我们需要确定一个以前,类似于走矩阵,此点的约束是:左下角或者右上角 原因:因为选择左下角或者右上角作为起点出发的话,可以根据该二维数组特性:拿右上角为例 如果查找的数比当前点小,则向左移动一个单位 如果查找的数比当前点大,则想下移动一个单位 ②:从[9出发(6<9) 向左] -> [8(6<8) 向左] -> [2(6

古风排版(不使用二维数组)

笑着哭i 提交于 2020-03-06 18:45:23
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。 输出格式: 按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。 输入样例: 4 This is a test case 输出样例: asa T st ih e tsi ce s 代码实现: #include<bits/stdc++.h> using namespace std; char str[1110]; //开这么大是因为最后一列算上多出的空格可能会超过1000,但超过的数量不会超过100 int main(){ int n, sum = 0; // sum用来存放输入的字符数 char c; scanf("%d", &n); getchar(); fill(str, str + 1110, ' '); //将字符数组全置为空格 c = getchar(); while(c != '\n'){ str[sum++] = c; c = getchar(); } int k; // k用来存加上最后多出的空格一共需要输出多少个字符 if(sum % n == 0) k = sum - 1; else k = (sum + n) / n * n -

【dp】矩阵乘法/数乘

元气小坏坏 提交于 2020-03-06 18:34:53
最大K乘积问题 « 问题描述 设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。 例如十进制整数 1234 划分为 3 段可有如下情形: 1 × 2 × 34 = 68 1 × 23 × 4 = 92 12 × 3 × 4 = 144 « 编程任务 对于给定的I 和k,编程计算I 的最大k 乘积。 « 数据输入 输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10) « 结果输出ss 计算出的最大k乘积。 输入文件示例 输出文件示例 input.txt output.txt 3 2 312 62 « 实现提示 参考矩阵连乘问题。 #include <iostream> #include <cstdio> #include <cmath> using namespace std; /* void copyMatrixchain(){ int i,r,j,k; memset(m,0,sizeof(m)); memset(s,0,sizeof(s)); for(r=2;r<=n;r++) //跨度从2-n { for(i=1;i<=n-r+1;i++) //遍历 { j=i+r-1; m[i][j]=m[i+1