cern.colt.matrix.impl.SparseDoubleMatrix2D Java Examples

The following examples show how to use cern.colt.matrix.impl.SparseDoubleMatrix2D. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: DoubleFactory2D.java    From database with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Constructs a matrix with the given shape, each cell initialized with zero.
 */
public DoubleMatrix2D make(int rows, int columns) {
	if (this==sparse) return new SparseDoubleMatrix2D(rows,columns);
	if (this==rowCompressed) return new RCDoubleMatrix2D(rows,columns);
	//if (this==rowCompressedModified) return new RCMDoubleMatrix2D(rows,columns);
	else return new DenseDoubleMatrix2D(rows,columns);
}
 
Example #2
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 5 votes vote down vote up
public static SparseDoubleMatrix2D reduceCandidateList(IntArrayList signatureNonZeros, IntArrayList functionNonZeros, SparseDoubleMatrix2D candidateList) {
	// reduce
	for(int i=0; i<signatureNonZeros.size(); ++i) {
		// find nodes with only one possible candidate
		if(candidateList.viewRow(signatureNonZeros.get(i)).cardinality() == 1) {
			int nonZero = -1;
			for(int j=0; j<functionNonZeros.size(); ++j) {
				if(candidateList.get(signatureNonZeros.get(i), functionNonZeros.get(j)) != 0.0) {
					nonZero = functionNonZeros.get(j);
					break;
				}
			}	

			if(nonZero == -1){
				System.out.println("REDUCE LOOP IS BROKEN - J NOT FOUND");
				System.out.println(signatureNonZeros);
				System.out.println(functionNonZeros);
				System.out.println(candidateList);
				System.out.println();
				break;
			}

			// remove candidacy of other nodes since it /has/ to be that one node
			for(int x=0; x<signatureNonZeros.size(); ++x) {
				if(x != i) {
					candidateList.set(signatureNonZeros.get(x), nonZero, 0.0);
				}
			}
		}
	}

	return candidateList;
}
 
Example #3
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 5 votes vote down vote up
public static int[] initializeDepths(SparseDoubleMatrix2D adjMat, int[] depths) {
	for(int j=0; j<depths.length; ++j){ 
		// this allows multiple entry points
		if(j == 0 || adjMat.viewColumn(j).cardinality() == 0){
			depths[j] = 0;
		} else {
			depths[j] = -1;
		}
	}
	return depths;
}
 
Example #4
Source File: DoubleFactory2D.java    From jAudioGIT with GNU Lesser General Public License v2.1 5 votes vote down vote up
/**
 * Constructs a matrix with the given shape, each cell initialized with zero.
 */
public DoubleMatrix2D make(int rows, int columns) {
	if (this==sparse) return new SparseDoubleMatrix2D(rows,columns);
	if (this==rowCompressed) return new RCDoubleMatrix2D(rows,columns);
	//if (this==rowCompressedModified) return new RCMDoubleMatrix2D(rows,columns);
	else return new DenseDoubleMatrix2D(rows,columns);
}
 
Example #5
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public static boolean scanMethodSubgraph(SparseDoubleMatrix2D signatureAdjacencyMatrix, SparseDoubleMatrix2D functionAdjacencyMatrix){
	// System.out.println("DEPTH: " + 0);
	// System.out.println(signatureAdjacencyMatrix);
	// System.out.println(functionAdjacencyMatrix);
	int signatureNodeCount = signatureAdjacencyMatrix.rows();
	int functionNodeCount = functionAdjacencyMatrix.rows();
	SparseDoubleMatrix2D candidateList = new SparseDoubleMatrix2D(signatureNodeCount, functionNodeCount);
	
	int[] signatureDepths = new int[signatureNodeCount];
	int[] functionDepths = new int[functionNodeCount];

	for(int functionEntry=0; functionEntry<functionNodeCount; ++functionEntry) {
		// arrays for tracking depths
		// function finds all nodes with no branches to them
		// first node (entry point) is always set at depth 0
		// System.out.println(functionEntry);
		candidateList.assign(0);

		Arrays.fill(signatureDepths, -1);
		Arrays.fill(functionDepths, -1);
	
		signatureDepths[0] = 0;
		functionDepths[functionEntry] = 0;

		// all nodes at depth 0 go into this vector
		SparseDoubleMatrix2D signatureVector = new SparseDoubleMatrix2D(1, signatureNodeCount);
		SparseDoubleMatrix2D functionVector = new SparseDoubleMatrix2D(1, functionNodeCount);

		// First node should be always be an entry point
		signatureVector.set(0, 0, 1.0);
		functionVector.set(0, functionEntry, 1.0);

		// get total children at depth 0+1
		// check function has sufficient nodes to satisfy sig at this depth
		// System.out.println("\t" + Algebra.DEFAULT.mult(signatureVector, signatureAdjacencyMatrix).cardinality());
		// System.out.println("\t" + Algebra.DEFAULT.mult(functionVector, functionAdjacencyMatrix).cardinality());
		if(Algebra.DEFAULT.mult(signatureVector, signatureAdjacencyMatrix).cardinality() > 
			Algebra.DEFAULT.mult(functionVector, functionAdjacencyMatrix).cardinality()) {
			// System.out.println("Insufficient function basic blocks at depth 1 to satisfy signature!");
			continue;
		}

		// build candidate list 
		candidateList.set(0, functionEntry, 1.0);

		// check bipartite match
		if(!bipartiteMatchingDepth(candidateList, signatureDepths, functionDepths, 0)) {
			// System.out.println("BIPARTITE MATCHING FAILED!");
			continue;
		}

		// check children recursively
		if(bfsCompare(candidateList, signatureAdjacencyMatrix, functionAdjacencyMatrix, signatureDepths, functionDepths, 1)) {
			return true;
		}
		// System.out.println();
	}

	return false;
}
 
Example #6
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public static boolean bfsCompare(	SparseDoubleMatrix2D candidateList, 
									SparseDoubleMatrix2D signatureAdjacencyMatrix, 
									SparseDoubleMatrix2D functionAdjacencyMatrix, 
									int[] signatureDepths,
									int[] functionDepths,
									int depth) {
	// System.out.println("DEPTH: " + depth);
	// get vectors for nodes at this depth by retrieving parents (depth - 1)
	DoubleMatrix2D signatureVector = new SparseDoubleMatrix2D(1, signatureDepths.length);
	DoubleMatrix2D functionVector = new SparseDoubleMatrix2D(1, functionDepths.length);
	DoubleMatrix2D parentSigVector = new SparseDoubleMatrix2D(1, signatureDepths.length);
	DoubleMatrix2D parentFunVector = new SparseDoubleMatrix2D(1, functionDepths.length);

	// get parents
	for(int i=0; i<signatureDepths.length; ++i) {
		if(signatureDepths[i] == (depth-1))
			parentSigVector.set(0, i, 1.0);
	}

	for(int i=0; i<functionDepths.length; ++i) {
		if(functionDepths[i] == (depth-1))
			parentFunVector.set(0, i, 1.0);
	}

	// get current nodes
	signatureVector = Algebra.DEFAULT.mult(parentSigVector, signatureAdjacencyMatrix);
	functionVector = Algebra.DEFAULT.mult(parentFunVector, functionAdjacencyMatrix);

	// mark nodes' depths if they are not currently set
	for(int i=0; i<signatureDepths.length; ++i) {
		if(signatureVector.get(0,i) > 0 && signatureDepths[i] < 0)
			signatureDepths[i] = depth;
	}

	for(int i=0; i<functionDepths.length; ++i) {
		if(functionVector.get(0,i) > 0 && functionDepths[i] < 0)
			functionDepths[i] = depth;
	}

	// make signatureVector only have nodes at this depth
	for(int i=0; i<signatureDepths.length; ++i) {
		if(signatureDepths[i] != depth) {
			signatureVector.set(0, i, 0.0);
		}
	}

	// make signatureVector only have nodes at this depth
	for(int i=0; i<functionDepths.length; ++i) {
		if(functionDepths[i] != depth) {
			functionVector.set(0, i, 0.0);
		}
	}

	// check signode count <= funnode count
	if(	Algebra.DEFAULT.mult(signatureVector, signatureAdjacencyMatrix).cardinality() > 
		Algebra.DEFAULT.mult(functionVector, functionAdjacencyMatrix).cardinality()) {
		// System.out.println("Insufficient function basic blocks at depth " + depth + " to satisfy signature!");
		return false;
	}

	// TODO: edge check needed?
	
	// build candidate list 
	candidateList = buildCandidateList(	candidateList, 
										signatureAdjacencyMatrix, 
										functionAdjacencyMatrix, 
										signatureDepths, 
										functionDepths, 
										signatureVector, 
										functionVector, 
										depth);

	if(bipartiteMatchingVector(candidateList, signatureVector, functionVector, signatureDepths, functionDepths)) {
	//if(bipartiteMatchingDepth(candidateList, signatureDepths, functionDepths, depth)) {
		

		// check if we've reached end of graph
		if(Algebra.DEFAULT.mult(signatureVector, signatureAdjacencyMatrix).cardinality() == 0)
			return true;

	} else {
		// System.out.println("Bipartite matching failed!");
		return false;
	}

	if(depth > MAX_DEPTH)
		return false;

	return bfsCompare(candidateList, signatureAdjacencyMatrix, functionAdjacencyMatrix, signatureDepths, functionDepths, depth+1);
}
 
Example #7
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public static SparseDoubleMatrix2D checkIncestConditionParents(	DoubleMatrix2D signatureNodeIncestVector,
																DoubleMatrix2D functionNodeIncestVector,
																SparseDoubleMatrix2D signatureAdjacencyMatrix, 
																SparseDoubleMatrix2D functionAdjacencyMatrix,
																int[] signatureDepths,
																int[] functionDepths,
																int depth,
																SparseDoubleMatrix2D candidateList) {

	SparseDoubleMatrix2D signatureSelector = new SparseDoubleMatrix2D(1, signatureDepths.length);
	SparseDoubleMatrix2D functionSelector = new SparseDoubleMatrix2D(1, functionDepths.length);

	for(int i=0; i<signatureNodeIncestVector.size(); ++i) {
		if(signatureNodeIncestVector.get(0, i) == 0.0)
			continue;

		signatureSelector.assign(0.0);
		signatureSelector.set(0, i, 1.0);

		DoubleMatrix2D signatureNodeParentVector = Algebra.DEFAULT.mult(signatureSelector, Algebra.DEFAULT.transpose(signatureAdjacencyMatrix));

		// only bipartite match on incest parents
		for(int iParent = 0; iParent < signatureNodeParentVector.columns(); ++iParent) {
			if(signatureNodeParentVector.get(0, iParent) > 0 && signatureDepths[iParent] != depth) {
				signatureNodeParentVector.set(0, iParent, 0.0);
			}
		}

		int signatureIncestParentCount = signatureNodeParentVector.cardinality();

		for(int j=0; j<functionNodeIncestVector.size(); ++j) {
			if(candidateList.get(i, j) == 0.0)
				continue;

			functionSelector.assign(0.0);
			functionSelector.set(0, j, 1.0);

			DoubleMatrix2D functionNodeParentVector = Algebra.DEFAULT.mult(functionSelector, Algebra.DEFAULT.transpose(functionAdjacencyMatrix));

			// only bipartite match on incest parents
			for(int iParent = 0; iParent < functionNodeParentVector.columns(); ++iParent) {
				if(functionNodeParentVector.get(0, iParent) > 0 && functionDepths[iParent] != depth) {
					functionNodeParentVector.set(0, iParent, 0.0);
				}
			}

			int functionIncestParentCount = functionNodeParentVector.cardinality();

			// bipartite matching, if !sufficient
			if(	candidateList.get(i, j) > 0 && (signatureIncestParentCount > functionIncestParentCount ||
				!bipartiteMatchingVector(candidateList, signatureNodeParentVector, functionNodeParentVector, signatureDepths, functionDepths))) {
				// remove candidacy
				candidateList.set(i, j, 0.0);
			}
		}
	}

	return candidateList;
}
 
Example #8
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public static SparseDoubleMatrix2D checkPreviouslyVisitedChildren(	IntArrayList signatureNonZeros, 
																	IntArrayList functionNonZeros,
																	SparseDoubleMatrix2D signatureAdjacencyMatrix, 
																	SparseDoubleMatrix2D functionAdjacencyMatrix,
																	int[] signatureDepths,
																	int[] functionDepths,
 																	SparseDoubleMatrix2D candidateList) {
	
	SparseDoubleMatrix2D signatureSelector = new SparseDoubleMatrix2D(1, signatureDepths.length);
	SparseDoubleMatrix2D functionSelector = new SparseDoubleMatrix2D(1, functionDepths.length);

	// reduce candidacy based on previously visited children
	for(int i=0; i<signatureNonZeros.size(); ++i) {
		// for node N, this sets the Nth bit of the vector to 1.0
		signatureSelector.assign(0.0);
		signatureSelector.set(0, signatureNonZeros.get(i), 1.0);

		// get children at depth <= current
		DoubleMatrix2D signatureNodeChildVector = Algebra.DEFAULT.mult(signatureSelector, signatureAdjacencyMatrix);

		// remove signature node's unvisited children
		for(int iChild = 0; iChild < signatureNodeChildVector.columns(); ++iChild) {
			if(signatureNodeChildVector.get(0, iChild) > 0 && signatureDepths[iChild] == -1) { // for the oposite conditional && signatureDepths[iChild] <= depth) {
				signatureNodeChildVector.set(0, iChild, 0.0);
			}
		}

		int signatureVisitedChildCount = signatureNodeChildVector.cardinality();

		for(int j=0; j<functionNonZeros.size(); ++j) {
			functionSelector.assign(0.0);
			functionSelector.set(0, functionNonZeros.get(j), 1.0);
			// get children at depth <= current
			DoubleMatrix2D functionNodeChildVector = Algebra.DEFAULT.mult(functionSelector, functionAdjacencyMatrix);

			// remove function node's unvisited children
			for(int iChild = 0; iChild < functionNodeChildVector.columns(); ++iChild) {
				if(functionNodeChildVector.get(0, iChild) > 0 && functionDepths[iChild] == -1) { // for the oposite conditional && functionDepths[iChild] <= depth) {
					functionNodeChildVector.set(0, iChild, 0.0);
				}
			}

			int functionVisitedChildCount = functionNodeChildVector.cardinality();
			
			// bipartite matching, if !sufficient
			if(	candidateList.get(signatureNonZeros.get(i), functionNonZeros.get(j)) > 0 && 
				(signatureVisitedChildCount > functionVisitedChildCount ||
				!bipartiteMatchingVector(candidateList, signatureNodeChildVector, functionNodeChildVector, signatureDepths, functionDepths))) {
				// remove candidacy
				candidateList.set(signatureNonZeros.get(i), functionNonZeros.get(j), 0.0);
			}
		}
	}

	return candidateList;
}
 
Example #9
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public static boolean bipartiteMatchingFull(SparseDoubleMatrix2D candidateList, int[] signatureDepths, int[] functionDepths, int depth) {
	UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);
	
	List<String> signatureIdcs = new ArrayList<String>();
	for(int i=0; i<signatureDepths.length; ++i) {
		signatureIdcs.add("s"+i);
		g.addVertex("s"+i);
	}

	List<String> functionIdcs = new ArrayList<String>();
	for(int j=0; j<functionDepths.length; ++j) {
		functionIdcs.add("f"+j);
		g.addVertex("f"+j);
	}

	for(int i=0; i<signatureDepths.length; ++i) {
		DoubleMatrix1D row = candidateList.viewRow(i);

		for(int j=0; j<row.size(); ++j) {
			if(row.get(j) != 0) {
				g.addEdge("s"+i, "f"+j);
			}
		}
	}

	Set<String> p1 = new HashSet<String>(signatureIdcs);
       Set<String> p2 = new HashSet<String>(functionIdcs);

	HopcroftKarpBipartiteMatching<String, DefaultEdge> alg = 
		new HopcroftKarpBipartiteMatching<String, DefaultEdge>(g, p1, p2);

	Set<DefaultEdge> match = alg.getMatching();

	//System.out.println(g.toString());
	//System.out.println(match);
	if(match.size() == signatureDepths.length)
		return true;
	else
		return false;

}
 
Example #10
Source File: ScanningAlgorithm.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public static boolean bipartiteMatchingDepth(SparseDoubleMatrix2D candidateList, int[] signatureDepths, int[] functionDepths, int depth) {
	UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);
	List<String> signatureIdcs = new ArrayList<String>();
	int signatureNodesAtDepth = 0;
	for(int i=0; i<signatureDepths.length; ++i) {
		if(signatureDepths[i] == depth) {
			signatureIdcs.add("s"+i);
			g.addVertex("s"+i);
			//System.out.println("bpm:\ts"+i);
			signatureNodesAtDepth++;
		}
	}

	List<String> functionIdcs = new ArrayList<String>();
	for(int j=0; j<functionDepths.length; ++j) {
		if(functionDepths[j] == depth) {
			functionIdcs.add("f"+j);
			g.addVertex("f"+j);
			//System.out.println("bpm:\tf"+j);
		}
	}

	for(int i=0; i<signatureDepths.length; ++i) {
		if(signatureDepths[i] == depth) {
			DoubleMatrix1D row = candidateList.viewRow(i);

			for(int j=0; j<row.size(); ++j) {
				if(row.get(j) == 1.0 && functionDepths[j] == depth) {
					g.addEdge("s"+i, "f"+j);
				}
			}
		}
	}

	Set<String> p1 = new HashSet<String>(signatureIdcs);
       Set<String> p2 = new HashSet<String>(functionIdcs);

	HopcroftKarpBipartiteMatching<String, DefaultEdge> alg = 
		new HopcroftKarpBipartiteMatching<String, DefaultEdge>(g, p1, p2);

	Set<DefaultEdge> match = alg.getMatching();

	// System.out.println(g.toString());
	// System.out.println(match);
	if(match.size() == signatureNodesAtDepth)
		return true;
	else
		return false;

}
 
Example #11
Source File: ControlFlowGraph.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public void normalize() {
	// System.out.println(adjacencyMatrix);
	int adjacencyMatrixSize = adjacencyMatrix.columns();
	
	if(adjacencyMatrixSize < 1)
		return;

	DoubleMatrix2D selector = new SparseDoubleMatrix2D(1, adjacencyMatrixSize);
	selector.set(0, 0, 1.0);
	// System.out.println(selector);
	// get vertices reachable from V0
	int cardinality = selector.cardinality();
	int lastCardinality = 0;

	DoubleDoubleFunction merge = new DoubleDoubleFunction() {
		public double apply(double a, double b) { 
			return (a > 0 || b > 0) ? 1 : 0; 
		}
	};

	while(cardinality != lastCardinality) {
		lastCardinality = cardinality;
		// selector = Algebra.DEFAULT.mult(selector, adjacencyMatrix);
		selector.assign(Algebra.DEFAULT.mult(selector, adjacencyMatrix), merge);
		// System.out.println(selector);
		cardinality = selector.cardinality();
	}

	// System.out.println(selector);

	if(cardinality == adjacencyMatrixSize) {
		return;
	}

	// IntArrayList nonZeros = new IntArrayList();
	// IntArrayList unusedInt = new IntArrayList();
	// DoubleArrayList unusedDouble = new DoubleArrayList();
	// selector.getNonZeros(unusedInt, nonZeros, unusedDouble);
	// SparseDoubleMatrix2D reduced = new SparseDoubleMatrix2D(adjacencyMatrix.viewSelection(nonZeros.elements(), nonZeros.elements()).toArray());

	SparseDoubleMatrix2D reduced = new SparseDoubleMatrix2D(cardinality, cardinality);
	int iCurrentVertex = 0;
	for(int i=0; i<adjacencyMatrixSize; ++i) {
		if(selector.get(0, i) != 0.0) {
			int jCurrentVertex = 0;
			for(int j=0; j<adjacencyMatrixSize; ++j) {
				if(selector.get(0, j) != 0.0){
					reduced.set(iCurrentVertex, jCurrentVertex, adjacencyMatrix.get(i, j));
					++jCurrentVertex;
				}
			}
			++iCurrentVertex;
		}
	}
	// System.out.println(reduced);
	// System.out.println("=======");
	adjacencyMatrix = reduced;
	vertexCount = adjacencyMatrix.columns();
	edgeCount = adjacencyMatrix.cardinality();
}
 
Example #12
Source File: ControlFlowGraph.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public SparseDoubleMatrix2D getAdjacencyMatrix() {
	return adjacencyMatrix;
}
 
Example #13
Source File: CFGSig.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public SparseDoubleMatrix2D getAdjacencyMatrix() {
	return adjacencyMatrix;
}
 
Example #14
Source File: CFGSig.java    From CFGScanDroid with GNU General Public License v2.0 4 votes vote down vote up
public void normalize() {
	// System.out.println(adjacencyMatrix);
	int adjacencyMatrixSize = adjacencyMatrix.columns();

	if(adjacencyMatrixSize < 1)
		return;

	DoubleMatrix2D selector = new SparseDoubleMatrix2D(1, adjacencyMatrixSize);
	selector.set(0, 0, 1.0);
	// System.out.println(selector);
	// get vertices reachable from V0
	int cardinality = selector.cardinality();
	int lastCardinality = 0;

	DoubleDoubleFunction merge = new DoubleDoubleFunction() {
		public double apply(double a, double b) { 
			return (a > 0 || b > 0) ? 1 : 0; 
		}
	};

	while(cardinality != lastCardinality) {
		lastCardinality = cardinality;
		// selector = Algebra.DEFAULT.mult(selector, adjacencyMatrix);
		selector.assign(Algebra.DEFAULT.mult(selector, adjacencyMatrix), merge);
		// System.out.println(selector);
		cardinality = selector.cardinality();
	}

	// System.out.println(selector);

	if(cardinality == adjacencyMatrixSize) {
		return;
	}

	// IntArrayList nonZeros = new IntArrayList();
	// IntArrayList unusedInt = new IntArrayList();
	// DoubleArrayList unusedDouble = new DoubleArrayList();
	// selector.getNonZeros(unusedInt, nonZeros, unusedDouble);
	// SparseDoubleMatrix2D reduced = new SparseDoubleMatrix2D(adjacencyMatrix.viewSelection(nonZeros.elements(), nonZeros.elements()).toArray());

	SparseDoubleMatrix2D reduced = new SparseDoubleMatrix2D(cardinality, cardinality);
	int iCurrentVertex = 0;
	for(int i=0; i<adjacencyMatrixSize; ++i) {
		if(selector.get(0, i) != 0.0) {
			int jCurrentVertex = 0;
			for(int j=0; j<adjacencyMatrixSize; ++j) {
				if(selector.get(0, j) != 0.0){
					reduced.set(iCurrentVertex, jCurrentVertex, adjacencyMatrix.get(i, j));
					++jCurrentVertex;
				}
			}
			++iCurrentVertex;
		}
	}
	// System.out.println(reduced);
	// System.out.println("=======");
	adjacencyMatrix = reduced;
	vertexCount = adjacencyMatrix.columns();
	edgeCount = adjacencyMatrix.cardinality();
}
 
Example #15
Source File: DoubleFactory2D.java    From database with GNU General Public License v2.0 2 votes vote down vote up
/**
 * Constructs a matrix with the given cell values.
 * <tt>values</tt> is required to have the form <tt>values[row][column]</tt>
 * and have exactly the same number of columns in every row.
 * <p>
 * The values are copied. So subsequent changes in <tt>values</tt> are not reflected in the matrix, and vice-versa.
 *
 * @param values The values to be filled into the new matrix.
 * @throws IllegalArgumentException if <tt>for any 1 &lt;= row &lt; values.length: values[row].length != values[row-1].length</tt>.
 */
public DoubleMatrix2D make(double[][] values) {
	if (this==sparse) return new SparseDoubleMatrix2D(values);
	else return new DenseDoubleMatrix2D(values);
}
 
Example #16
Source File: DoubleFactory2D.java    From jAudioGIT with GNU Lesser General Public License v2.1 2 votes vote down vote up
/**
 * Constructs a matrix with the given cell values.
 * <tt>values</tt> is required to have the form <tt>values[row][column]</tt>
 * and have exactly the same number of columns in every row.
 * <p>
 * The values are copied. So subsequent changes in <tt>values</tt> are not reflected in the matrix, and vice-versa.
 *
 * @param values The values to be filled into the new matrix.
 * @throws IllegalArgumentException if <tt>for any 1 &lt;= row &lt; values.length: values[row].length != values[row-1].length</tt>.
 */
public DoubleMatrix2D make(double[][] values) {
	if (this==sparse) return new SparseDoubleMatrix2D(values);
	else return new DenseDoubleMatrix2D(values);
}