--- /dev/null
+package org.simantics.spreadsheet.graph;\r
+\r
+import java.io.Serializable;\r
+\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.spreadsheet.graph.formula.FormulaError2;\r
+\r
+public class SpreadsheetMatrix implements Serializable {\r
+\r
+ private static final long serialVersionUID = 5729700370527844640L;\r
+ \r
+ private int w;\r
+ private int h;\r
+ public Object[] values;\r
+ \r
+ public SpreadsheetMatrix(int w, int h) {\r
+ this.w = w;\r
+ this.h = h;\r
+ this.values = new Object[w*h];\r
+ }\r
+ \r
+ public Object get(int row, int column) {\r
+ return values[w*row+column];\r
+ }\r
+ \r
+ public void set(int row, int column, Object value) {\r
+ values[w*row+column] = value;\r
+ }\r
+\r
+ public int getWidth() {\r
+ return w;\r
+ }\r
+\r
+ public int getHeight() {\r
+ return h;\r
+ }\r
+ \r
+ public double sum() {\r
+ double result = 0;\r
+ for(int i=0;i<values.length;i++) {\r
+ Number n = SpreadsheetGraphUtils.asValidNumber(values[i]);\r
+ if(n != null) result += n.doubleValue();\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ public Object sumWithFormulaError(){\r
+ Double result = 0.0;\r
+ for(int i = 0; i < values.length; i++){\r
+ Object obj = values[i];\r
+ if(obj != null){\r
+ FormulaError2 error = FormulaError2.forObject(obj);\r
+ if(error!=null) return error.getString();\r
+ \r
+ Number n = SpreadsheetGraphUtils.asValidNumber(obj);\r
+ if(n != null) result += n.doubleValue();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public double average() {\r
+ double result = 0;\r
+ double count = 0;\r
+ for(int i=0;i<values.length;i++) {\r
+ Number n = SpreadsheetGraphUtils.asValidNumber(values[i]);\r
+ if(n != null) {\r
+ result += n.doubleValue();\r
+ count++;\r
+ }\r
+ }\r
+ if(count == 0) return result;\r
+ return result / count;\r
+ }\r
+ \r
+ public double countOfActualDoubleValues(){\r
+ double count = 0.0;\r
+ for(int i = 0; i < values.length; i++){\r
+ Number n = SpreadsheetGraphUtils.asValidNumber(values[i]);\r
+ if(n!=null) count++;\r
+ }\r
+ return count;\r
+ }\r
+ \r
+ public Object productWithFormulaError(){\r
+ Double result = 1.0;\r
+ boolean atLeastOne = false;\r
+ for(int i = 0; i < values.length; i++){\r
+ Object obj = values[i];\r
+ if(obj != null){\r
+ FormulaError2 error = FormulaError2.forObject(obj);\r
+ if(error!=null) return error.getString();\r
+ \r
+ Number n = SpreadsheetGraphUtils.asValidNumber(values[i]);\r
+ if(n != null) {\r
+ double dval = n.doubleValue();\r
+ if(dval<=0) return FormulaError2.NUM.getString();\r
+ result = result*dval;\r
+ atLeastOne = true;\r
+ }\r
+ }\r
+ }\r
+ if(atLeastOne) return result;\r
+ else return 0.0;\r
+ }\r
+ \r
+ public SpreadsheetMatrix pow(Object exponent_) {\r
+ if(exponent_ instanceof SpreadsheetMatrix) {\r
+ SpreadsheetMatrix exponent = (SpreadsheetMatrix)exponent_;\r
+ SpreadsheetMatrix result = new SpreadsheetMatrix(exponent.w, h);\r
+ for(int i=0;i<h;i++) {\r
+ for(int j=0;j<exponent.w;j++) {\r
+ result.set(i,j, Math.pow(SpreadsheetGraphUtils.asNumber(get(i, 0)),\r
+ SpreadsheetGraphUtils.asNumber(exponent.get(0, j))));\r
+ }\r
+ }\r
+ return result;\r
+ } else {\r
+ double n = SpreadsheetGraphUtils.asNumber(exponent_);\r
+ SpreadsheetMatrix result = new SpreadsheetMatrix(w, h);\r
+ for(int i=0;i<result.values.length;i++) {\r
+ result.values[i] = Math.pow(SpreadsheetGraphUtils.asNumber(values[i]), n);\r
+ }\r
+ return result;\r
+ }\r
+ }\r
+ \r
+ \r
+}
\ No newline at end of file