一个矩阵 JavaScript
//矩阵运算的函数
;(function(global){ global.Matrix = {
//生成对角矩阵,非零元素都为1
eye : function( n ){
var result = [];
var arr;
for ( var i = 0; i < n; i++ ) {
arr = []
for ( var j = 0; j < n; j++ ) {
if (i === j )
arr[j] = 1;
else
arr[j] = 0;
}
result.push( arr );
}
return result;
},
//生成全零的矩阵,height:行,width:列
zeros : function( height, width ) {
return this._produceSameNumber( height, width, 0 );
},
ones : function( height, width ) {
return this._produceSameNumber( height, width, 1 );
}, //生成数字全部一样的矩阵,比如说0或者1
_produceSameNumber : function( height, width, number ) {
var result = [];
var arr;
for ( var i = 0; i < height; i++ ) {
arr = (new Array( width )).join( ',' ).split( ',' ).map( function(){
return number;
});
result.push( arr );
}
return result;
}, //定义矩阵相加或是相减
_addOrSub : function( arr1, arr2, operater ) {
var shape1 = this.shape(arr1);
var shape2 = this.shape( arr2);
var result = [], arr;
if ( !_isSameShape( shape1, shape2 ) ) {
throw new Error( '两个数组的维度不同,不能相加')
}else{
for ( var i = 0; i < shape1[0]; i++ ) {
arr = [];
for ( var j = 0; j < shape1[1]; j++ ) {
if ( operater )
arr[j] = _getItem(arr1, i, j) + _getItem( arr2, i, j);
else
arr[j] = _getItem(arr1, i, j) - _getItem( arr2, i, j);
}
result.push( arr );
}
}
return result;
}, add : function( arr1, arr2 ) {
return this._addOrSub( arr1, arr2, true);
}, sub : function( arr1, arr2 ) {
return this._addOrSub( arr1, arr2, false);
},
//字符转矩阵
toMatrix:function(config){
if(Object.prototype.toString.call(config)=="[object String]") {
var list2 = config.split("\n")
list2 = list2.map(function (item) {
var arr = item.split(",")
return arr
})
return list2;
}else{
return config;
}
},
//转字符
toString:function(data){
var arr=[]
data.forEach(function(item){
arr.push(item.join(","))
})
return arr.join("\n")
},
//矩阵的数乘
multip : function( arr, number ) {
var shape1 = this.shape(arr);
var result = [], a; for ( var i = 0; i < shape1[0]; i++ ) {
a = arr[i].map( function( item ) {
return item * number;
});
result.push( a );
} return result;
}, //矩阵之间的相乘
dot : function( arr1, arr2 ) {
var shape1 = this.shape( arr1 );
var shape2 = this.shape( arr2 ); var result = [], arr;
// console.log( shape1, shape2 )
//必须的条件是:第一个矩阵的列数等于第二个矩阵的行数
if ( shape1[1] !== shape2[0] ) {
throw new Error('两个矩阵不满足矩阵相乘的规范,' +
'规范是第一个矩阵的列数等于第二个矩阵的行数,请检查。')
}else{
//先将整个的数组构造出来
for ( var i = 0; i < shape1[0]; i++ ) {
result.push([]);
} //最终的矩阵的行列分别为:shape1[0] shape2[1]
//先从列开始循环比较好
for ( i = 0; i < shape2[1]; i++ ) {
for ( var j = 0; j < shape1[0]; j++ ) {
var row = _getRow( arr1, shape1, j);
var column = _getColumn( arr2, shape2, i );
// console.log( row, column )
result[j][i] = singleMultip( row, column );
}
}
}
return result;
}, //获取矩阵的转置矩阵
transpose : function( arr ) {
var shape = this.shape( arr );
var result, a; //result需要有与原来相反的行和列,行列的数量调换
result = ( new Array( shape[1] ) ).join( ',' ).split( ',' ).map( function(){
return [];
}); //将原来的行转变成现在的列
for ( var i = 0; i < shape[0]; i++ ) {
var row = _getRow( arr, shape, i );
result.forEach( function( item, index ) {
item.push( row[index] );
} )
}
return result;
}, //获取这个矩阵的行和列
shape : function( M ) {
var height,width;
if ( _isArray( M ) && M.length > 0 ) {
if ( _isArray( M[0] ) ){
height = M.length;
width = M[0].length;
}else{
throw new Error( '数组的第一个元素不是数组形式或者' +
'数组长度等于0,请检查' );
}
}else{
throw new Error( M + '不是数组形式或者数组长度等于0,请检查' );
}
return [height, width ];
}
}; function _isArray( arr ) {
if ( Array.isArray ){
return Array.isArray( arr );
}else {
return Object.prototype.toString.call( arr ).toLowerCase() === '[object array]';
}
} function _isSameShape( shape1, shape2 ) {
return shape1[0] === shape2[0] && shape1[1] === shape2[1];
} function _getItem( arr, i, j ) {
var result = _isArray( arr[0] ) ? arr[i][j] : arr[j];
return result;
} //获取数组的某一列的所有值
function _getColumn( arr, shape, j ) {
var result = [];
for (var i = 0; i < shape[0]; i++ ) {
result.push( _getItem( arr, i, j ) );
}
return result;
} //取出数组某一行的所有值
function _getRow( arr, shape, i ) {
//如果数组是二维数组的话,返回某一行的数据,某则返回整个数组
if ( _isArray( arr[0] ) ) {
return __copy(arr[i]);
}else{
return arr;
}
} //一个单行与单列的矩阵相乘
function singleMultip( arr1, arr2 ) {
var result = 0;
for ( var i = 0; i < arr1.length; i++ ) {
result += arr1[i] * arr2[i];
}
return result;
} //深度复制数组
function __copy( arr ) {
return arr.map( function(item){
return item;
})
}
})(global);
module.exports=Matrix; //var b = Matrix.ones( 4,3 );
//console.log(Matrix.toString(b))
//b=Matrix.transpose(b)
//console.log(Matrix.toString(b))
一个矩阵 JavaScript的更多相关文章
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时 ...
- artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口
artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口 自适应内容 artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应 ...
- 【前端酷站】分享一个纯 Javascript 的图表库与立体像素风制作~
今天小编为大家推荐一个神奇的酷站.ECharts,一个纯 Javascript 的图表库. 以下是各个几个不错的界面的介绍: 首页:http://echarts.baidu.com/ 在首页有完整的说 ...
- Task 4.2 求一个矩阵的最大子矩阵的和
任务:输入一个二维整形数组,数组里有正数也有负数.二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). (1)设计思想:把二维矩阵分解成 ...
- 给定一个矩阵 A, 返回 A 的转置矩阵。
给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7], ...
- 剑指offer - 顺时针打印矩阵 - JavaScript
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
- 开博第二篇:记一个利用JavaScript,编写PS脚本,开发图片量产工具
背景:身在一个有实业的电商公司,设计部的妹子们总是会有做不完的商品图片,当然了,要是做点有技术含量的美化工作也罢,但是最近她们很是无聊,总是要做一些重复性的工作,就比如如题所说的,图片量产,量产什么呢 ...
- 一个意想不到的Javascript内存泄漏
原文:http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html 本周我在Meter的同事追踪到了一 ...
- Code Kata:螺旋矩阵 javascript实现
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 如图所示,就是一个5*5的螺旋矩阵 我的思路如下: 第一步:拆分 ...
随机推荐
- c语言实践 统计输入的一串正整数里面奇数和偶数的个数
怎么考虑这个问题. 首先先确定肯定是需要一个变量保存输入的数据的,我们叫它input,最后结果要的是个数,所以需要另外两个变量来保存奇数的个数和偶数的个数. int input int countJ ...
- Linux bind-utils
一.简介 DNS是一种将域名解析为IP地址的服务.如:www.turbolinux.com.cn通过DNS解析,可以得到210.77.38.126.bind是linux系统下的一个DNS服务程序.bi ...
- 无法链接到windows服务
1.先将鼠标移动到桌面右下角的显示桌面按钮处,选择右侧按钮列表中的搜索列表,输入cmd.exe,右击搜索结果,选择以管理员身份运行. 2.然后输入netsh winsock reset catalog ...
- mac安装nose,command not found:nosetests
mac通过pip install nose失败,看了一下是权限的问题,重新用sudo pip install nose安装,安装成功. 但是执行nosetests时,提示command not fou ...
- document.domain 跨域问题
document.domain用来得到当前网页的域名. 比如在地址栏里输入:javascript:alert(document.domain); //www.315ta.com我们也可以给docume ...
- C++的惨痛教训(未完待续)
题记:只有痛才能让人铭记!痛促进进步~ 1. strncpy,大家都知道要做安全检查,可是谁都有嫌麻烦的时候,尤其是自己很自信不会产生溢出的时候,可能不会坑了自己,却会坑了使用这段代码的人.所以,1. ...
- 数据库连接工具HeidiSql介绍(支持MySQL,MariaDB,Microsoft SQL或PostgreSQL)
前言 Navicat作为比较老牌的数据库连接工具知名度比较广,功能也比较完善,但对入门的广大初学者来讲,怎么去找安装的资源包是一大难题,虽然经过一些“渠道”能找到可以正常使用的绿色安装包,但从长期来讲 ...
- ComicEnhancerPro 系列教程十九:用JpegQuality看JPG文件的压缩参数
作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十九:用JpegQu ...
- Jquery 页面元素事件绑定
场景: 用一个Table来展示数据信息列表,通过鼠标点击Table中的Tr来获取到当前选中的数据行信息. <table class="Table" width="1 ...
- 类与类之间的两种关系------新标准c++程序设计
在c++中,类和类之间有两种基本关系:复合关系和继承关系. 复合关系也称为“has a”关系或“有”的关系,表现为封闭类,即一个类以另一个类的对象作为成员变量. 继承关系也称为“is a”关系或“是” ...