[ https://issues.apache.org/jira/browse/MAHOUT-300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12836647#action_12836647 ]
Robin Anil commented on MAHOUT-300: ----------------------------------- {code} public double dot(Vector x) { if (size() != x.size()) { throw new CardinalityException(size(), x.size()); } if(this == x) return dotSelf(); double result = 0; if (this instanceof DenseVector && x instanceof DenseVector) { for (int i = 0; i < x.size(); i++) { result += this.getQuick(i) * x.getQuick(i); } return result; } else if (this instanceof SequentialAccessSparseVector && x instanceof SequentialAccessSparseVector) { // For sparse SeqAccVectors. do dot product without lookup in a linear fashion Iterator<Element> myIter = iterateNonZero(); Iterator<Element> otherIter = x.iterateNonZero(); Element myCurrent = null; Element otherCurrent = null; while (myIter.hasNext() && otherIter.hasNext()) { if (myCurrent == null) myCurrent = myIter.next(); if (otherCurrent == null) otherCurrent = otherIter.next(); int myIndex = myCurrent.index(); int otherIndex = otherCurrent.index(); if (myIndex < otherIndex) { // due to the sparseness skipping occurs more hence checked before equality myCurrent = null; } else if (myIndex > otherIndex){ otherCurrent = null; } else { // both are equal result += myCurrent.get() * otherCurrent.get(); myCurrent = null; otherCurrent = null; } } return result; } else if (!(this instanceof SequentialAccessSparseVector) // rand.seq rand.rand dense.seq dense.rand && (x instanceof SequentialAccessSparseVector || x instanceof RandomAccessSparseVector)) { // Try to get the speed boost associated fast/normal seq access on x and quick lookup on this Iterator<Element> iter = x.iterateNonZero(); while (iter.hasNext()) { Element element = iter.next(); result += element.get() * getQuick(element.index()); } return result; } else { // seq.rand. seq.dense rand.dense // TODO: can optimize more based on the numDefaultElements in the vectors Iterator<Element> iter = iterateNonZero(); while (iter.hasNext()) { Element element = iter.next(); result += element.get() * x.getQuick(element.index()); } return result; } } public double dotSelf() { double result = 0; if (this instanceof DenseVector) { for (int i = 0; i < size(); i++) { double value = this.getQuick(i); result += value * value; } return result; } else { Iterator<Element> iter = iterateNonZero(); while (iter.hasNext()) { Element element = iter.next(); double value = element.get(); result += value * value; } return result; } } {code} > Solve performance issues with Vector Implementations > ---------------------------------------------------- > > Key: MAHOUT-300 > URL: https://issues.apache.org/jira/browse/MAHOUT-300 > Project: Mahout > Issue Type: Improvement > Affects Versions: 0.3 > Reporter: Robin Anil > Fix For: 0.3 > > Attachments: MAHOUT-300.patch, MAHOUT-300.patch, MAHOUT-300.patch, > MAHOUT-300.patch, MAHOUT-300.patch, MAHOUT-300.patch > > > AbstractVector operations like times > public Vector times(double x) { > Vector result = clone(); > Iterator<Element> iter = iterateNonZero(); > while (iter.hasNext()) { > Element element = iter.next(); > int index = element.index(); > result.setQuick(index, element.get() * x); > } > return result; > } > should be implemented as follows > public Vector times(double x) { > Vector result = clone(); > Iterator<Element> iter = result.iterateNonZero(); > while (iter.hasNext()) { > Element element = iter.next(); > element.set(element.get() * x); > } > return result; > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.