private float[] NormaliseCol(float[,] dataArray, DataMetadata metadataPreset, int col) { //for each dimensions (column) normalise all data float[] result = GetCol(dataArray, col); float minDimension = result.Min(); float maxDimension = result.Max(); if (minDimension == maxDimension) { // where there are no distinct values, need the dimension to be distinct // otherwise lots of maths breaks with division by zero, etc. // this is the most elegant hack I could think of, but should be fixed properly in future minDimension -= 1.0f; maxDimension += 1.0f; } DataSource.DimensionData.Metadata metadata = dimensionData[col].MetaData; metadata.minValue = minDimension; metadata.maxValue = maxDimension; metadata.categories = result.Distinct().Select(x => normaliseValue(x, minDimension, maxDimension, 0.0f, 1.0f)).ToArray(); metadata.categoryCount = metadata.categories.Count(); metadata.binCount = (int)(maxDimension - minDimension + 1); if (metadataPreset != null) { foreach (var binSizePreset in metadataPreset.BinSizePreset) { if (binSizePreset.index == col) { metadata.binCount = binSizePreset.binCount; } } } dimensionData[col].setMetadata(metadata); for (int j = 0; j < result.Length; j++) { if (minDimension < maxDimension) { result[j] = normaliseValue(result[j], minDimension, maxDimension, 0f, 1f); } else { // avoid NaNs or nonsensical normalization result[j] = 0; } } return result; }
/// <summary> /// internal function: normalises all the data input between 0 and 1 /// </summary> private float[,] normaliseArray(float[,] dataArray, DataMetadata metadataPreset) { //1 make a copy of the parsed array float[,] normArray = new float[dataArray.GetUpperBound(0) + 1, dataArray.GetUpperBound(1) + 1]; //for each dimensions (column) normalise all data for (int i = 0; i <= normArray.GetUpperBound(1); i++) { float[] rawDimension = GetCol(dataArray, i); float minDimension = rawDimension.Min(); float maxDimension = rawDimension.Max(); DataSource.DimensionData.Metadata metadata = dimensionData[i].MetaData; metadata.minValue = minDimension; metadata.maxValue = maxDimension; metadata.binCount = (int)(maxDimension - minDimension + 1); if (metadataPreset != null) { foreach (var binSizePreset in metadataPreset.BinSizePreset) { if (binSizePreset.index == i) { metadata.binCount = binSizePreset.binCount; } } } dimensionData[i].setMetadata(metadata); float[] normalisedDimension = new float[rawDimension.Length]; // dimensionsRange.Add(i, new Vector2(minDimension, maxDimension)); for (int j = 0; j < rawDimension.Length; j++) { if (minDimension < maxDimension) { normalisedDimension[j] = normaliseValue(rawDimension[j], minDimension, maxDimension, 0f, 1f); } else { // avoid NaNs or nonsensical normalization normalisedDimension[j] = 0; } } SetCol<float>(normArray, i, normalisedDimension); } return normArray; }
private float[] NormaliseCol(float[,] dataArray, DataMetadata metadataPreset, int col) { //for each dimensions (column) normalise all data float[] result = GetCol(dataArray, col); float minDimension = result.Min(); float maxDimension = result.Max(); DataSource.DimensionData.Metadata metadata = dimensionData[col].MetaData; metadata.minValue = minDimension; metadata.maxValue = maxDimension; metadata.categories = result.Distinct().Select(x => normaliseValue(x, minDimension, maxDimension, 0.0f, 1.0f)).ToArray(); metadata.categoryCount = result.Distinct().Count(); metadata.binCount = (int)(maxDimension - minDimension + 1); if (metadataPreset != null) { foreach (var binSizePreset in metadataPreset.BinSizePreset) { if (binSizePreset.index == col) { metadata.binCount = binSizePreset.binCount; } } } dimensionData[col].setMetadata(metadata); for (int j = 0; j < result.Length; j++) { if (minDimension < maxDimension) { result[j] = normaliseValue(result[j], minDimension, maxDimension, 0f, 1f); } else { // avoid NaNs or nonsensical normalization result[j] = 0; } } return result; }