/// <summary> /// Transforms the input array based upon the values provided. /// </summary> /// <param name="input">The input array</param> /// <returns>A scaled array</returns> public Node[] Transform(Node[] input) { Node[] output = new Node[input.Length]; for (int i = 0; i < output.Length; i++) { int index = input[i].Index; double value = input[i].Value; output[i] = new Node(index, Transform(value, index)); } return(output); }
private static double ComputeSquaredDistance(Node[] xNodes, Node[] yNodes) { Node x = xNodes[0]; Node y = yNodes[0]; int xLength = xNodes.Length; int yLength = yNodes.Length; int xIndex = 0; int yIndex = 0; double sum = 0; while (true) { if (x.Index == y.Index) { double d = x.Value - y.Value; sum += d * d; xIndex++; yIndex++; if (xIndex < xLength && yIndex < yLength) { x = xNodes[xIndex]; y = yNodes[yIndex]; } else if (xIndex < xLength) { x = xNodes[xIndex]; break; } else if (yIndex < yLength) { y = yNodes[yIndex]; break; } else { break; } } else if (x.Index > y.Index) { sum += y.Value * y.Value; if (++yIndex < yLength) { y = yNodes[yIndex]; } else { break; } } else { sum += x.Value * x.Value; if (++xIndex < xLength) { x = xNodes[xIndex]; } else { break; } } } for (; xIndex < xLength; xIndex++) { double d = xNodes[xIndex].Value; sum += d * d; } for (; yIndex < yLength; yIndex++) { double d = yNodes[yIndex].Value; sum += d * d; } return(sum); }
private static double Dot(Node[] xNodes, Node[] yNodes) { double sum = 0; int xlen = xNodes.Length; int ylen = yNodes.Length; if (xlen == 0) { throw new ArgumentOutOfRangeException("xNodes"); } if (ylen == 0) { throw new ArgumentOutOfRangeException("yNodes"); } int i = 0; int j = 0; Node x = xNodes[0]; Node y = yNodes[0]; while (true) { if (x.Index == y.Index) { sum += (x.Value * y.Value); i++; j++; if (i < xlen && j < ylen) { x = xNodes[i]; y = yNodes[j]; } else { break; } } else { if (x.Index > y.Index) { ++j; if (j < ylen) { y = yNodes[j]; } else { break; } } else { ++i; if (i < xlen) { x = xNodes[i]; } else { break; } } } } return(sum); }