How to output transforms for retina images from one upload?
I'd like to use image transforms to output the retina images but need
  to preserve the width and height of the original as they vary in look
  and dimensions.


This statement kind of contradicts itself. :) You want to create different sizes, but keep the width and height of the original? My interpretation is that you'll always be uploading an image that's a number of times bigger that the @1x size? Let's say you always upload these images @3x, try something like this:

{% set myImage = entry.myImage() %}
{% set baseWidth = myImage.getWidth() / 3 %}
{% set baseHeight = myImage.getHeight() / 3 %}

&lt;img 
  src="{{ myImage.getUrl({ width: baseWidth, height: baseHeight }) }}" 
  srcset="
    {{ myImage.getUrl({ width: baseWidth, height: baseHeight }) }} 1x,
    {{ myImage.getUrl({ width: baseWidth*2, height: baseHeight*2 }) }} 2x,
    {{ myImage.getUrl() }} 3x"  
  alt="{{ myImage.title }}" 
  width="{{ baseWidth }}" 
  height="{{ baseheight }}"&gt;


Hope this helps.